﻿<!DOCTYPE html>
<html lang="en"><head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta charset="utf-8">


<!--

1. Add more detail to the dropped by like "dropped by Gorilla Grodd in Strykers alert"
2. Plan line list needs to be sorted by date
3. figure out bunker buster damage historically, generalize to any attack
4. Create a web server to host this

Search everywhere for <script> to make sure dropbox or company didn't add code to my code
Take out Debug button
-->

<!--
//********************************************************************
//*
//*  File:          combat_log_data_analyzer.html
//*  Author:        ClassicFumbles	USPC	classicfumbles@rocketmail.com
//*  Created:       05/01/2012
//*  Version:       5.4
//*  History:
//*	Version 1.0	Idea by Noxx, Scanned logs and displayed Exobit and Lockbox counts
//*	Version 2.0	Modified by ClassicFumbles, now displays All exobits, a few collections,
//*				lockbox counts + knockouts with dates, allowed filter by character
//*	Version 3.0	Incorporated code from Comixfan, All Collections now counted and displayed
//*	Version 4.0	Modified by ClassicFumbles, Entire GUI rewrite using HTA instead of msgbox
//*                              added google api graphs, javascript datepicker, view marks, cash,
//*                              feats, time.  Now loads data into disconnected recordset.
//*	Version 5.0	Complete rewrite into HTML5 and javascript only, no jscript, hta, or vbscript
//*	Version 5.1	Bug fixes, implement weapons, armor, feats, plans, damage.
//*	Version 5.2	Create HTML to display exobit and needed data instead of textarea textbox
//*                              exobit data displayed in table now, needed data in tree like structure
//*	Version 5.3	Added ability to figure out how long it took to fill out split personality style
//*	Version 5.4	Added Vault option to view vault trips and gear gotten
//*
//*  Description:   Scans DC Universe Online (DCUO) combat log text files
//*                   and accumulates the data to display to the user
//*                   For example, it counts how many exobits a certain
//*                   character has collected.
//*
//********************************************************************
-->
</head>

<body>

<style>
  #progress_bar {
    margin: 10px 0;
    padding: 3px;
    border: 1px solid #000;
    font-size: 14px;
    clear: both;
    opacity: 0;
    -moz-transition: opacity 1s linear;
    -o-transition: opacity 1s linear;
    -webkit-transition: opacity 1s linear;
  }
  #progress_bar.loading {
    opacity: 1.0;
  }
  #progress_bar .percent {
    background-color: #99ccff;
    height: auto;
    width: 0;
  }
  #LeftChartDiv { width: 500px; float: left}
  #RightChartDiv { width: 500px; float: right}

  body {
	font-family: Verdana, Tahoma, Arial, Helvetica, sans-serif;
	font-size: .8em;
	}

  /* the div that holds the date picker calendar */
  .dpDiv {
  	}

  /* the table (within the div) that holds the date picker calendar */
  .dpTable {
	font-family: Tahoma, Arial, Helvetica, sans-serif;
	font-size: 12px;
	text-align: center;
	color: #505050;
	background-color: #ece9d8;
	border: 1px solid #AAAAAA;
	}

  /* a table row that holds date numbers (either blank or 1-31) */
  .dpTR {
	}

  /* the top table row that holds the month, year, and forward/backward buttons */
  .dpTitleTR {
  	}

  /* the second table row, that holds the names of days of the week (Mo, Tu, We, etc.) */
  .dpDayTR {
	}

  /* the bottom table row, that has the "This Month" and "Close" buttons */
  .dpTodayButtonTR {
	}

  /* a table cell that holds a date number (either blank or 1-31) */
  .dpTD {
	border: 1px solid #ece9d8;
	}

  /* a table cell that holds a highlighted day (usually either today's date or the current date field value) */
  .dpDayHighlightTD {
	background-color: #CCCCCC;
	border: 1px solid #AAAAAA;
	}

  /* the date number table cell that the mouse pointer is currently over (you can use contrasting colors to make it apparent which cell is being hovered over) */
  .dpTDHover {
	background-color: #aca998;
	border: 1px solid #888888;
	cursor: pointer;
	color: red;
	}

  /* the table cell that holds the name of the month and the year */
  .dpTitleTD {
	}

  /* a table cell that holds one of the forward/backward buttons */
  .dpButtonTD {
	}

  /* the table cell that holds the "This Month" or "Close" button at the bottom */
  .dpTodayButtonTD {
	}

  /* a table cell that holds the names of days of the week (Mo, Tu, We, etc.) */
  .dpDayTD {
	background-color: #CCCCCC;
	border: 1px solid #AAAAAA;
	color: white;
	}

  /* additional style information for the text that indicates the month and year */
  .dpTitleText {
	font-size: 12px;
	color: gray;
	font-weight: bold;
	}

  /* additional style information for the cell that holds a highlighted day (usually either today's date or the current date field value) */
  .dpDayHighlight {
	color: red;
	font-weight: bold;
	}

  /* the forward/backward buttons at the top */
  .dpButton {
	font-family: Verdana, Tahoma, Arial, Helvetica, sans-serif;
	font-size: 10px;
	color: gray;
	background: #d8e8ff;
	font-weight: bold;
	padding: 0px;
	}

  /* the "This Month" and "Close" buttons at the bottom */
  .dpTodayButton {
	font-family: Verdana, Tahoma, Arial, Helvetica, sans-serif;
	font-size: 10px;
	color: gray;
	background: #d8e8ff;
	font-weight: bold;
	}

  table.exobitTableStyle {
        border-spacing: 0px;
        border: 1px solid #999999;
        font-family:'arial';
        width:100%;
        margin-left: auto;
        margin-right: auto;
  }
  table.exobitTableStyle th{
        background: #E9EEF2;
        color: #B73650;
        font-weight: bold;
        border: 0;
        border-right: 1px solid #999999;
        border-bottom: 1px solid #999999;
  }
  table.exobitTableStyle td{
        padding:3px;
        color: #000000;
        border: 0;
        border-right: 1px solid #999999;
        border-bottom: 1px solid #999999;
  }
  table.exobitTableStyle tr.alt td{
        background: #E9EEF2;
  }

  /* Put this inside a @media qualifier so Netscape 4 ignores it */
  @media screen, print {
	/* Turn off list bullets */
	ul.mktree  li { list-style: none; }
	/* Control how "spaced out" the tree is */
	ul.mktree, ul.mktree ul , ul.mktree li { margin-left:10px; padding:0px; }
	/* Provide space for our own "bullet" inside the LI */
	ul.mktree  li           .bullet { padding-left: 15px; }
	/* Show "bullets" in the links, depending on the class of the LI that the link's in */
	ul.mktree  li.liOpen    .bullet { cursor: pointer; background: url(minus.gif)  center left no-repeat; }
	ul.mktree  li.liClosed  .bullet { cursor: pointer; background: url(plus.gif)   center left no-repeat; }
	ul.mktree  li.liBullet  .bullet { cursor: default; background: url(bullet.gif) center left no-repeat; }
	/* Sublists are visible or not based on class of parent LI */
	ul.mktree  li.liOpen    ul { display: block; }
	ul.mktree  li.liClosed  ul { display: none; }

	/* Format menu items differently depending on what level of the tree they are in */
	/* Uncomment this if you want your fonts to decrease in size the deeper they are in the tree */
  /*
	ul.mktree  li ul li { font-size: 90% }
  */
  }

</style>

<table id="table0" width="100%">
  <tbody><tr>
    <td valign="top" width="50%">
       <p>Select DCUO Combat Log to load:</p>
       <p><input id="files" name="file" type="file"></p>
       <div id="progress_bar"><div class="percent">0%</div></div>
    </td>
    <td valign="top" width="50%">
       <br><br>
       <input id="helpbutton" value="Help" onclick="javascript:HelpWindow();" type="button">
       <input id="aboutbutton" value="About" onclick="javascript:AboutWindow();" type="button">
       <input id="quitbutton" value="Exit" onclick="javascript:ExitProgram();" type="button">
       <button style="visibility: hidden;" name="cancelbutton" id="cancelbutton" onclick="javascript:cancelReadFile();">Cancel read</button>
       <!-- input value="Debug" onclick="javascript:displaymessage();" type="button" -->
    </td>
  </tr>
</tbody></table>

<!-- Setting the display to none causes this table to be invisible -->
<!-- After the combat log is loaded, display will be set to block  -->
<!-- which will make it visible to the user -->

<table id="table1" style="display: none;" width="100%">
  <tbody><tr>
    <td valign="top" width="35%">
      <bold>DCUO Combat Log Data Analyzer</bold>
      <br>
      <br>Select Data to display.
      <br>
      <select id="DropDownMenu_DataOption" name="DropDownMenu_DataOption" onchange="javascript:dataOptionExecute();">
        <option selected="selected">Exobits</option>
        <option>Collections</option>
        <option>Collections Needed</option>
        <option>Lockboxes</option>
        <option>Marks</option>
        <option>Cash</option>
        <option>Knockouts</option>
        <option>Time</option>
        <option>Feats</option>
        <option>Feats Needed</option>
        <option>Plans</option>
        <option>Damage Daily</option>
        <option>Weapon Drops</option>
        <option>Armor Drops</option>
        <option>Armor Needed</option>
        <option>Roles</option>
        <option>Split Personality</option>
        <option>Vault Trips</option>
      </select>
      <br>
      <br>Select Character to filter on.
      <br>Only this character's data will be displayed.
      <br>
      <select id="DropDownMenu_Character" name="DropDownMenu_Character" onchange="javascript:dataOptionExecute();"></select>
      <br>
      <br>Select date to start filtering.
      <br>Only data after this date will be displayed.
      <br>
      <div>
      Start Date: <input id="SDate" name="SDate" onclick="javascript:displayDatePicker('SDate');">
      </div>
      <br>Select date to end filtering.
      <br>Only data before this date will be displayed.
      <br>
      <div>
      End Date: <input id="EDate" name="EDate" onclick="javascript:displayDatePicker('EDate');">
      </div>
      <br>
    </td>
    <td valign="top" width="65%">
     <div id="TableDisplay" name="TableDisplay" style="display: none;"></div>
     <textarea id="StatsDisplay" name="StatsDisplay" rows="20" cols="100" style="display: block;"></textarea>
    </td>
  </tr>
</tbody></table>
<table width="100%">
  <tbody><tr>
    <td>
    <div id="LeftChartDiv" style="width:20%; height: 290px;"></div>
    <div id="RightChartDiv" style="width:80%; height: 290px;"></div>
    </td>
  </tr>
</tbody></table>
<span id="debugspan" name="debugspan"></span>



<script type="text/javascript" src="https://www.google.com/jsapi"></script>

<script>


var VERSION = "5.4";


// Check for the various File API support.

if (window.File && window.FileReader && window.FileList) {
  // alert('Great success! All the File APIs are supported.');
} else {
  var errorMessage = 'The File APIs are not fully supported in this browser.\nThis program will not work.  Please try a newer version supporting HTML5.';
  alert(errorMessage);
  ExitProgram();
}


// When the file hasn't been loaded yet or is done loading, hide the cancel file load button

document.getElementById('cancelbutton').style.visibility='hidden'; // hide when file loading not happening


// These are use to display a progress bar when loading the combat logs

var upload = document.getElementsByTagName('input')[0];
var progress = document.querySelector('.percent');

var dataLoaded=false;
var dataLoadinProgress=false;


var allLogLinesJSON = {};   // master global data structure holding my parsed data

var loadedFiles = [];       // array of file sizes I have already loaded, used to try to prevent loading same file twice.


// If google object isn't found, there was a problem getting the google api javascript code

if (typeof(google) == "undefined") {
  var alertMessage = 'There was a problem accessing a Google API.\r\n\r\n';
  alertMessage += 'If you are not connected to the Internet, that is why.\r\n';
  alertMessage += "You just won't be able to see the graphs and charts\r\n";
  alertMessage += 'If you can access www.google.com, then maybe you saved this file from the website to your local PC.\r\n';
  alertMessage += "That's ok but you need to make one change\r\n";
  alertMessage += 'Edit this html file and where it shows this:\r\n';
  alertMessage += '<script type="text/javascript" src="combat_log_analyzer_files/jsapi"></script\>\r\n';
  alertMessage += ' or something like that, change to this:\r\n';
  alertMessage += '<script type=\"text/javascript\" src=\"https://www.google.com/jsapi\"></script\>\r\n';
  alertMessage += 'This loads the google API code which produces the line charts and pie charts\r\n';
  alert(alertMessage);
}
else {
  // Load the Visualization API and the piechart package.
  google.load('visualization', '1.0', {'packages':['corechart']});
}


// Display a popup window with some About information in it
function AboutWindow() {
  var aboutMessage = "DCUO Combat Log Data Analyzer\r\n";
  aboutMessage += "   version " + VERSION + "\r\n";
  aboutMessage += "  This tool reads from the DCUO combat log files on your PC and \r\n";
  aboutMessage += "      aggregates the data\r\n\r\n";
  aboutMessage += "  Send bug reports or duel invites to ClassicFumbles (USPC) \r\n\r\n";
  aboutMessage += "  DC UNIVERSE software © 2012 Sony Online Entertainment LLC.\r\n";
  aboutMessage += "  DC UNIVERSE and all related characters and elements are trademarks of and © DC Comics.\r\n";
  alert(aboutMessage);
}


function HelpWindow() {
  var helpMessage = "This tool reads the DC Universe Online combat log files.\r\n\r\n";
  helpMessage += "Your combat logs basically have information about your character.\r\n";
  helpMessage += "  There is some information about other characters but basically only how it affects you.\r\n\r\n";
  helpMessage += "It is written entirely in javascript and HTML5.\r\n";
  helpMessage += "You can view the code by loading it into Notepad.\r\n\r\n";
  helpMessage += "You will have to load the combat log files yourself.  To do this, click the Browse button.\r\n";
  helpMessage += "Generally there are two combat log files you can load.  First load one, then the other\r\n";
  helpMessage += "You can load as many combat logs as you want, just keep clicking Browse.\r\n";
  helpMessage += "You might only have one combat log file.\r\n";
  helpMessage += "You have to load these manually because it makes the browser more secure.\r\n";
  helpMessage += "For very large files on slow computers, this may take a while to load.\r\n\r\n";
  helpMessage += "For Windows XP users, the combat log should be located somewhere like\r\n";
  helpMessage += "  C:\\My Documents\\My Games\\DC Universe Online\\DCGame\Logs\\Combat.log\r\n\r\n";
  helpMessage += "For Windows 7 users, the combat log should be located somewhere like\r\n";
  helpMessage += "  C:\\Users\\YOURCOMPUTERNAME\\Documents\\My Games\\DC Universe Online\\DCGame\\Logs\\combat.log\r\n";
  helpMessage += "Another combat log could be located somewhere like\r\n";
  helpMessage += "  C:\\Users\\YOURCOMPUTERNAME\\Documents\\My Games\\DC Universe Online\\Logs\\combat.log\r\n\r\n";
  alert(helpMessage);
}


function ExitProgram() {
  window.close();
  self.close();
}


function cancelReadFile() {
  dataLoadinProgress=false;
}


var loadTimeStart = new Date();
var loadTimeEnd = new Date();
var chunkSize = 32768;

upload.onchange = function (e) {
    e.preventDefault();

    if (dataLoadinProgress) {
      errorMessage = 'Another combat log is already loading...';
      alert(errorMessage);
      return false;
    }

    document.getElementById('progress_bar').style.display="block";

    progress.style.width = '0%';
    progress.textContent = '0%';

    // "files" is a FileList of file objects.

    var file = upload.files[0];

    if ( !file.type.match("") || (file.name != 'combat.log') ) {
            errorMessage = 'Only DCUO Combat log files can be selected';
            alert(errorMessage);
            return false;
    }

    for (var i = 0; i < loadedFiles.length; i++) {
      if (file.size == loadedFiles[i]) {
            errorMessage = 'Already loaded this combat log file';
            alert(errorMessage);
            return false;
      }
    }

    function errorHandler(evt) {
      switch(evt.target.error.code) {
        case evt.target.error.NOT_FOUND_ERR:
          alert('File Not Found!');
          break;
        case evt.target.error.NOT_READABLE_ERR:
          alert('File is not readable');
          break;
        case evt.target.error.ABORT_ERR:
          break; // noop
        default:
          alert('An error occurred reading this file.');
       };
    }

    function abortRead() {
      reader.abort();
      dataLoaded = false;
      dataLoadinProgress=false;
      progress.style.width = '0%';
      progress.textContent = 'File load canceled';
      alert('File read cancelled');
    }


    loadTimeStart = new Date();

    dataLoadinProgress=true;
    document.getElementById('cancelbutton').style.visibility='visible'; // show

    var reader = new FileReader();

    reader.onerror = errorHandler;
    reader.onabort = abortRead;

    // If we use onloadend, we need to check the readyState.
    reader.onloadend = function(evt) {
      if (evt.target.readyState == FileReader.DONE) { // DONE == 2

        // An attempt at not using alot of memory
        var logLineJSON = JSON.stringify(allLogLinesJSON_before);
        allLogLinesJSON_before = {};
        //var JSONstring = "" + logLineJSON;
        // allLogLinesJSON = JSON.parse(JSONstring);
        concatenateData(logLineJSON);

        // Now that data is loaded, figure out the top 10 characters with data
        getTopCharacters();

        // Remember this file name so if they try to load it again we will respond with error
        // Except they purposely don't store the path, only file name but for us, it will always
        //   be the same.  may need to store first line instead.
        // Going with size as a hack
        loadedFiles.push(file.size);

        progress.style.width = '100%';
        progress.textContent = 'File loaded: 100%';

        // Set the dataLoaded boolean so we know we can start using data
        dataLoaded = true;
        dataLoadinProgress=false;

        loadTimeEnd = new Date();

        document.getElementById('cancelbutton').style.visibility='hidden'; // hide

        // Now that the data from the combat log is loaded into memory
        //   Set the HTML table to block to be visible on the browser
        //   so the user can filter and display the data
        document.getElementById('table1').style.display="block";

        // Will use default selection of Exobit and display screen
        dataOptionExecute();
      }
    };

    reader.onloadstart = function(e) {
      document.getElementById('progress_bar').className = 'loading';
    };


    reader.onload = function (event) {

      if (dataLoadinProgress == false) {
        abortRead();
      }

      //console.log("Here chunk = " + chunk + " chunks = " +  chunks);
      //console.log(chunk + 'Read bytes: ' + start + ' - ' + end + ' of ' + file.size + ' byte file');

      var arrayOfLogLines=new Array();

      arrayOfLogLines = event.target.result.split("\n"); // split on line-endings

      // Assume the last line was truncated and throw it out, we will reread again
      var removedLine = arrayOfLogLines.pop();
      offset = removedLine.length;

      // Of all these lines, let's only keep certain ones (like ones with string received)
      //    and save all of these into JSON objects with the character name as a key
      parseLogLinesForKeywords(arrayOfLogLines);

      // An attempt at not using alot of memory
      var logLineJSON = JSON.stringify(allLogLinesJSON_before);
      allLogLinesJSON_before = {};
      concatenateData(logLineJSON);

      var percentLoaded = Math.round((chunk / chunks) * 100);
      if (percentLoaded < 100) {
        progress.style.width = percentLoaded + '%';
        progress.textContent = "File loading: " + percentLoaded + '%';
      }

      if (++chunk <= chunks) {
        // console.info(chunk);
        loadNext(); // shortcut here
      }
    };

    var start = 0;
    var end = 0;
    var offset = 0;
    chunkSize = Math.ceil(file.size / 100);
    if (chunkSize < 1024) { chunkSize = 1024; }


    var chunks = Math.ceil(file.size / chunkSize);
    var chunk = 0;

    // BLOB = (binary large object)

    function loadNext() {

      start = end - offset;
      end = start + chunkSize;
      if (end > file.size) { end = file.size; }

      if (file.mozSlice) {
        // Firefox implementation
        var blobSlice = file.mozSlice(start, end);
      } else if (file.webkitSlice) {
        // Chrome implementation
        var blobSlice = file.webkitSlice(start, end);
      } else {
        alert("Cannot use this browser"); return;
      }
      reader.readAsBinaryString(blobSlice);
    }

    loadNext();

  return false;
};


function getTopCharacters() {

  var associativeArray = {};

  var characterRankedOne   = "";
  var characterRankedTwo   = "";
  var characterRankedThree = "";
  var characterRankedFour  = "";
  var characterRankedFive  = "";
  var characterRankedSix   = "";
  var characterRankedSeven = "";
  var characterRankedEight = "";
  var characterRankedNine  = "";
  var characterRankedTen   = "";

  var characterRankedOneCount   = 0;
  var characterRankedTwoCount   = 0;
  var characterRankedThreeCount = 0;
  var characterRankedFourCount  = 0;
  var characterRankedFiveCount  = 0;
  var characterRankedSixCount   = 0;
  var characterRankedSevenCount = 0;
  var characterRankedEightCount = 0;
  var characterRankedNineCount  = 0;
  var characterRankedTenCount   = 0;

  var people = Object.keys(allLogLinesJSON);

  // Initialize counts of lines per character
  people.forEach(function(person) {
    associativeArray[person] = 0;
  });

  // Count up how many lines each character has
  people.forEach(function(person) {
    var itemtypes = Object.keys(allLogLinesJSON[person]);
    itemtypes.forEach(function(itype) {
      var lineArray = allLogLinesJSON[person][itype];
      if (lineArray.length > 0) {
        associativeArray[person] = associativeArray[person] + lineArray.length;
      }
    });
  });

  // Find the top X characters who have the most log lines
  people.forEach(function(person) {
    if (associativeArray[person] > characterRankedOneCount) {
      // We have a new max, shift all else down one
      characterRankedTen = characterRankedNine;
      characterRankedTenCount = characterRankedNineCount;
      characterRankedNine = characterRankedEight;
      characterRankedNineCount = characterRankedEightCount;
      characterRankedEight = characterRankedSeven;
      characterRankedEightCount = characterRankedSevenCount;
      characterRankedSeven = characterRankedSix;
      characterRankedSevenCount = characterRankedSixCount;
      characterRankedSix = characterRankedFive;
      characterRankedSixCount = characterRankedFiveCount;
      characterRankedFive = characterRankedFour;
      characterRankedFiveCount = characterRankedFourCount;
      characterRankedFour = characterRankedThree;
      characterRankedFourCount = characterRankedThreeCount;
      characterRankedThree = characterRankedTwo;
      characterRankedThreeCount = characterRankedTwoCount;
      characterRankedTwo = characterRankedOne;
      characterRankedTwoCount = characterRankedOneCount;
      characterRankedOne = person;
      characterRankedOneCount = associativeArray[person];
    }
    else {
      if (associativeArray[person] > characterRankedTwoCount) {
        characterRankedTen = characterRankedNine;
        characterRankedTenCount = characterRankedNineCount;
        characterRankedNine = characterRankedEight;
        characterRankedNineCount = characterRankedEightCount;
        characterRankedEight = characterRankedSeven;
        characterRankedEightCount = characterRankedSevenCount;
        characterRankedSeven = characterRankedSix;
        characterRankedSevenCount = characterRankedSixCount;
        characterRankedSix = characterRankedFive;
        characterRankedSixCount = characterRankedFiveCount;
        characterRankedFive = characterRankedFour;
        characterRankedFiveCount = characterRankedFourCount;
        characterRankedFour = characterRankedThree;
        characterRankedFourCount = characterRankedThreeCount;
        characterRankedThree = characterRankedTwo;
        characterRankedThreeCount = characterRankedTwoCount;
        characterRankedTwo = person;
        characterRankedTwoCount = associativeArray[person];
      }
      else {
        if (associativeArray[person] > characterRankedThreeCount) {
          characterRankedTen = characterRankedNine;
          characterRankedTenCount = characterRankedNineCount;
          characterRankedNine = characterRankedEight;
          characterRankedNineCount = characterRankedEightCount;
          characterRankedEight = characterRankedSeven;
          characterRankedEightCount = characterRankedSevenCount;
          characterRankedSeven = characterRankedSix;
          characterRankedSevenCount = characterRankedSixCount;
          characterRankedSix = characterRankedFive;
          characterRankedSixCount = characterRankedFiveCount;
          characterRankedFive = characterRankedFour;
          characterRankedFiveCount = characterRankedFourCount;
          characterRankedFour = characterRankedThree;
          characterRankedFourCount = characterRankedThreeCount;
          characterRankedThree = person;
          characterRankedThreeCount = associativeArray[person];
        }
        else {
          if (associativeArray[person] > characterRankedFourCount) {
            characterRankedTen = characterRankedNine;
            characterRankedTenCount = characterRankedNineCount;
            characterRankedNine = characterRankedEight;
            characterRankedNineCount = characterRankedEightCount;
            characterRankedEight = characterRankedSeven;
            characterRankedEightCount = characterRankedSevenCount;
            characterRankedSeven = characterRankedSix;
            characterRankedSevenCount = characterRankedSixCount;
            characterRankedSix = characterRankedFive;
            characterRankedSixCount = characterRankedFiveCount;
            characterRankedFive = characterRankedFour;
            characterRankedFiveCount = characterRankedFourCount;
            characterRankedFour = person;
            characterRankedFourCount = associativeArray[person];
          }
          else {
            if (associativeArray[person] > characterRankedFiveCount) {
              characterRankedTen = characterRankedNine;
              characterRankedTenCount = characterRankedNineCount;
              characterRankedNine = characterRankedEight;
              characterRankedNineCount = characterRankedEightCount;
              characterRankedEight = characterRankedSeven;
              characterRankedEightCount = characterRankedSevenCount;
              characterRankedSeven = characterRankedSix;
              characterRankedSevenCount = characterRankedSixCount;
              characterRankedSix = characterRankedFive;
              characterRankedSixCount = characterRankedFiveCount;
              characterRankedFive = person;
              characterRankedFiveCount = associativeArray[person];
            }
            else {
              if (associativeArray[person] > characterRankedSixCount) {
                characterRankedTen = characterRankedNine;
                characterRankedTenCount = characterRankedNineCount;
                characterRankedNine = characterRankedEight;
                characterRankedNineCount = characterRankedEightCount;
                characterRankedEight = characterRankedSeven;
                characterRankedEightCount = characterRankedSevenCount;
                characterRankedSeven = characterRankedSix;
                characterRankedSevenCount = characterRankedSixCount;
                characterRankedSix = person;
                characterRankedSixCount = associativeArray[person];
              }
              else if (associativeArray[person] > characterRankedSevenCount) {
                characterRankedTen = characterRankedNine;
                characterRankedTenCount = characterRankedNineCount;
                characterRankedNine = characterRankedEight;
                characterRankedNineCount = characterRankedEightCount;
                characterRankedEight = characterRankedSeven;
                characterRankedEightCount = characterRankedSevenCount;
                characterRankedSeven = person;
                characterRankedSevenCount = associativeArray[person];
              }
              else if (associativeArray[person] > characterRankedEightCount) {
                characterRankedTen = characterRankedNine;
                characterRankedTenCount = characterRankedNineCount;
                characterRankedNine = characterRankedEight;
                characterRankedNineCount = characterRankedEightCount;
                characterRankedEight = person;
                characterRankedEightCount = associativeArray[person];
              }
              else if (associativeArray[person] > characterRankedNineCount) {
                characterRankedTen = characterRankedNine;
                characterRankedTenCount = characterRankedNineCount;
                characterRankedNine = person;
                characterRankedNineCount = associativeArray[person];
              }
              else if (associativeArray[person] > characterRankedTenCount) {
                characterRankedTen = person;
                characterRankedTenCount = associativeArray[person];
              }
            }
          }
        }
      }
    }
  });

  // Populate the Character select drop down menu with the top 10 characters in log

  var listbox = document.getElementById("DropDownMenu_Character");
  listbox.options[0]=new Option("All characters","All characters");
  listbox.options[1]=new Option(characterRankedOne, characterRankedOne);
  listbox.options[2]=new Option(characterRankedTwo, characterRankedTwo);
  listbox.options[3]=new Option(characterRankedThree, characterRankedThree);
  listbox.options[4]=new Option(characterRankedFour, characterRankedFour);
  listbox.options[5]=new Option(characterRankedFive, characterRankedFive);
  listbox.options[6]=new Option(characterRankedSix, characterRankedSix);
  listbox.options[7]=new Option(characterRankedSeven, characterRankedSeven);
  listbox.options[8]=new Option(characterRankedEight, characterRankedEight);
  listbox.options[9]=new Option(characterRankedNine, characterRankedNine);
  listbox.options[10]=new Option(characterRankedTen, characterRankedTen);
};


var npcCollection = [];

npcCollection.push({name:"Brainiac Worker",           location:"Riverside Hotel",   type:"Duo"});
npcCollection.push({name:"Brainiac Tumbler",          location:"Riverside Hotel",   type:"Duo"});
npcCollection.push({name:"Brainiac Jumper",           location:"Riverside Hotel",   type:"Duo"});
npcCollection.push({name:"Brainiac Patroller",        location:"Riverside Hotel",   type:"Duo"});
npcCollection.push({name:"Brainiac Turret",           location:"Riverside Hotel",   type:"Duo"});
npcCollection.push({name:"Brainiac Guardian MK-III",  location:"Riverside Hotel",   type:"Duo"});
npcCollection.push({name:"Brainiac Guardian MK-XXII", location:"Riverfront Center", type:"Duo"});
npcCollection.push({name:"Brainiac Repair Drone",     location:"Riverfront Center", type:"Duo"});
npcCollection.push({name:"Brainiac Guardian MK-IV",   location:"Gotham Hospital",   type:"Duo"});

npcCollection.push({name:"Hypnotized CCPD Deputy",    location:"Cosmic Treadmill: Flashback",type:"Duo"});
npcCollection.push({name:"Hypnotized CCPD SWAT",      location:"Cosmic Treadmill: Flashback",type:"Duo"});
npcCollection.push({name:"Hypnotized CCPD Officer",   location:"Cosmic Treadmill: Flashback",type:"Duo"});
npcCollection.push({name:"Hypnotized swat captain",   location:"Cosmic Treadmill: Flashback",type:"Duo"});
npcCollection.push({name:"Prototype Riot-bot",        location:"Cosmic Treadmill: Flashback",type:"Duo"});
npcCollection.push({name:"Evil Eye",                  location:"Cosmic Treadmill: Flashback",type:"Duo"});
npcCollection.push({name:"Ethereal Bat",              location:"Cosmic Treadmill: Flashback",type:"Duo"});
npcCollection.push({name:"Abra Kadabra",              location:"Cosmic Treadmill: Flashback",type:"Duo"});
npcCollection.push({name:"Pied Piper",                location:"Cosmic Treadmill: Flashback",type:"Duo"});
npcCollection.push({name:"Paradox Reaper",            location:"Cosmic Treadmill: Flashback",type:"Duo"});
npcCollection.push({name:"Paramedic",                 location:"Cosmic Treadmill: Flashback",type:"Duo"});
npcCollection.push({name:"Prisoner",                  location:"Cosmic Treadmill: Flashback",type:"Duo"});
npcCollection.push({name:"Sonic Emitter",             location:"Cosmic Treadmill: Flashback",type:"Duo"});
npcCollection.push({name:"Oblivion Ram",              location:"Cosmic Treadmill: Flashback",type:"Duo"});
npcCollection.push({name:"Soul Glutton",              location:"Cosmic Treadmill: Flashback",type:"Duo"});

npcCollection.push({name:"The Supreme Justice",         location:"South Gotham Courthouse",type:"Alert"});
npcCollection.push({name:"The Bailiff",                 location:"South Gotham Courthouse",type:"Alert"});
npcCollection.push({name:"The Defense Attorney",        location:"South Gotham Courthouse",type:"Alert"});
npcCollection.push({name:"The Prosecutor",              location:"South Gotham Courthouse",type:"Alert"});
npcCollection.push({name:"Brainiac Witness",            location:"South Gotham Courthouse",type:"Alert"});
npcCollection.push({name:"Evidence Courier",            location:"South Gotham Courthouse",type:"Alert"});
npcCollection.push({name:"Brainiac Justice Guard",      location:"South Gotham Courthouse",type:"Alert"});
npcCollection.push({name:"Brainiac Justice Enforcer",   location:"South Gotham Courthouse",type:"Alert"});
npcCollection.push({name:"Brainiac Executioner",        location:"South Gotham Courthouse",type:"Alert"});
npcCollection.push({name:"Brainiac Stealth Unit Alpha", location:"South Gotham Courthouse",type:"Alert"});
npcCollection.push({name:"Brainiac Stealth Unit Beta",  location:"South Gotham Courthouse",type:"Alert"});
npcCollection.push({name:"Brainiac Stealth Unit Gamma", location:"South Gotham Courthouse",type:"Alert"});
npcCollection.push({name:"Brainiac Constable",          location:"South Gotham Courthouse",type:"Alert"});
npcCollection.push({name:"Box of Evidence",             location:"South Gotham Courthouse",type:"Alert"});

npcCollection.push({name:"Black Adam",          location:"Kahndaq", type:"Raid", level:30, species:"Humanoid"});
npcCollection.push({name:"Cadaver",             location:"Kahndaq", type:"Raid", level:30, species:"Undead"});
npcCollection.push({name:"Crypt Defender",      location:"Kahndaq", type:"Raid", level:30, species:"Reptile"});
npcCollection.push({name:"Eagle Soldier",       location:"Kahndaq", type:"Raid", level:30, species:"Undead"});
npcCollection.push({name:"Jackal Soldier",      location:"Kahndaq", type:"Raid", level:30, species:"Undead"});
npcCollection.push({name:"General Adnan",       location:"Kahndaq", type:"Raid", level:30, species:"Undead"});
npcCollection.push({name:"Lazarus Thief",       location:"Kahndaq", type:"Raid", level:30, species:"Reptile"});
npcCollection.push({name:"Lazarus Warrior",     location:"Kahndaq", type:"Raid", level:30, species:"Reptile"});
npcCollection.push({name:"Lazarus Scorpion",    location:"Kahndaq", type:"Raid", level:30, species:"Reptile"});
npcCollection.push({name:"Lazarus Disciple",    location:"Kahndaq", type:"Raid", level:30, species:"Reptile"});
npcCollection.push({name:"Lion Soldier",        location:"Kahndaq", type:"Raid", level:30, species:"Undead"});
npcCollection.push({name:"Pharaoh Vezina",      location:"Kahndaq", type:"Raid", level:30, species:"Undead"});
npcCollection.push({name:"Priest of Anubis",    location:"Kahndaq", type:"Raid", level:30, species:"Undead"});
npcCollection.push({name:"Protector of Anubis", location:"Kahndaq", type:"Raid", level:30, species:"Undead"});
npcCollection.push({name:"The Gatekeeper",      location:"Kahndaq", type:"Raid", level:30, species:"Undead"});
npcCollection.push({name:"Underling",           location:"Kahndaq", type:"Raid", level:30, species:"Undead"});
npcCollection.push({name:"Waterkeeper",         location:"Kahndaq", type:"Raid", level:30, species:"Undead"});
npcCollection.push({name:"Deranged Mummy",      location:"Kahndaq", type:"Raid", level:30, species:"Undead"});

npcCollection.push({name:"Bastion Turret",         location:"Batcave: Outer Caverns", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"The Huntress",           location:"Batcave: Outer Caverns", type:"Raid", level:30, species:"Humanoid"});
npcCollection.push({name:"Robin",                  location:"Batcave: Outer Caverns", type:"Raid", level:30, species:"Humanoid"});
npcCollection.push({name:"Nightwing",              location:"Batcave: Outer Caverns", type:"Raid", level:30, species:"Humanoid"});
npcCollection.push({name:"Batwoman",               location:"Batcave: Outer Caverns", type:"Raid", level:30, species:"Humanoid"});
npcCollection.push({name:"Sentinel C-CU",          location:"Batcave: Outer Caverns", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Sentinel DP-5",          location:"Batcave: Outer Caverns", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Drone Walker",           location:"Batcave: Outer Caverns", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Omega Sentry",           location:"Batcave: Outer Caverns", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Perimeter Guard",        location:"Batcave: Outer Caverns", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Riot Control Prototype", location:"Batcave: Outer Caverns", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Security Drone",         location:"Batcave: Outer Caverns", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Security Sentry",        location:"Batcave: Outer Caverns", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Shield Armor",           location:"Batcave: Outer Caverns", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Wing Armor",             location:"Batcave: Outer Caverns", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Pacifier Drone",         location:"Batcave: Outer Caverns", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Arrester Drone",         location:"Batcave: Outer Caverns", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Flashbang Drone",        location:"Batcave: Outer Caverns", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Batcave Drone Dispenser",location:"Batcave: Outer Caverns", type:"Raid", level:30, species:"Mechanical"});

npcCollection.push({name:"Armored Robotic Custodian", location:"Batcave: Inner Sanctum", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Brother Eye",               location:"Batcave: Inner Sanctum", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Elite Servitor",            location:"Batcave: Inner Sanctum", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Elite Subjugator",          location:"Batcave: Inner Sanctum", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Elite Guardian",            location:"Batcave: Inner Sanctum", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Perimeter Drone",           location:"Batcave: Inner Sanctum", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Zetta-Drone",               location:"Batcave: Inner Sanctum", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"OMAC Nano Repair Unit",     location:"Batcave: Inner Sanctum", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Bat-Drone",                 location:"Batcave: Inner Sanctum", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"OMAC Prime",                location:"Batcave: Inner Sanctum", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"NeurOMAC",                  location:"Batcave: Inner Sanctum", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Brainiac Progenitor",       location:"Batcave: Inner Sanctum", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Eye Drone",                 location:"Batcave: Inner Sanctum", type:"Raid", level:30, species:"Mechanical"});

npcCollection.push({name:"Brainiac",                  location:"Batcave: Brainiac Sub-Construct", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"OMAC Batman",               location:"Batcave: Brainiac Sub-Construct", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"NeurOMAC Elite",            location:"Batcave: Brainiac Sub-Construct", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Avatar Crawler",            location:"Batcave: Brainiac Sub-Construct", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Avatar of Tech",            location:"Batcave: Brainiac Sub-Construct", type:"Raid", level:30, species:"Mechanical"});

npcCollection.push({name:"Blue Star Crawler",     location:"Fortress of Solitude: The Chasm", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Brainiac Hoarder",      location:"Fortress of Solitude: The Chasm", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Brainiac Hunter",       location:"Fortress of Solitude: The Chasm", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Brainiac Microbot",     location:"Fortress of Solitude: The Chasm", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Brainiac Phaser",       location:"Fortress of Solitude: The Chasm", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Brainiac Roamer",       location:"Fortress of Solitude: The Chasm", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Brainiac Sentry",       location:"Fortress of Solitude: The Chasm", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Brainiac Sun Guardian", location:"Fortress of Solitude: The Chasm", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Brainiac Sun Sentry",   location:"Fortress of Solitude: The Chasm", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Burrower",              location:"Fortress of Solitude: The Chasm", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Dark Sun Crawler",      location:"Fortress of Solitude: The Chasm", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Dwarf Mite",            location:"Fortress of Solitude: The Chasm", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Red Giant Crawler",     location:"Fortress of Solitude: The Chasm", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Scorpionod MK-1",       location:"Fortress of Solitude: The Chasm", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Solar Flare Crawler",   location:"Fortress of Solitude: The Chasm", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Sunstone Broodmother",  location:"Fortress of Solitude: The Chasm", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Sunstone Domineer",     location:"Fortress of Solitude: The Chasm", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Sunstone Herald",       location:"Fortress of Solitude: The Chasm", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Sunstone Hunter",       location:"Fortress of Solitude: The Chasm", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Sunstone Phaser",       location:"Fortress of Solitude: The Chasm", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Sunstone Predator",     location:"Fortress of Solitude: The Chasm", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Sunstone Retriever",    location:"Fortress of Solitude: The Chasm", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Sunstone Turret",       location:"Fortress of Solitude: The Chasm", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Super Nova Crawler",    location:"Fortress of Solitude: The Chasm", type:"Raid", level:30, species:"Mechanical"});
npcCollection.push({name:"Krypto",                location:"Fortress of Solitude: The Chasm", type:"Raid", level:30, species:"Mechanical"});

npcCollection.push({name:"Avatar of Meta",            location:"Fortress of Solitude: Power Core",type:"Raid"});
npcCollection.push({name:"Tentacle",                  location:"Fortress of Solitude: Power Core",type:"Raid"});
npcCollection.push({name:"Corrupt Jor-El A.I.",       location:"Fortress of Solitude: Power Core",type:"Raid"});
npcCollection.push({name:"Prime Assassin",            location:"Fortress of Solitude: Power Core",type:"Raid"});
npcCollection.push({name:"Sunstone Assassin",         location:"Fortress of Solitude: Power Core",type:"Raid"});
npcCollection.push({name:"Sunstone Dominator",        location:"Fortress of Solitude: Power Core",type:"Raid"});
npcCollection.push({name:"Stalker",                   location:"Fortress of Solitude: Power Core",type:"Raid"});
npcCollection.push({name:"Supergirl",                 location:"Fortress of Solitude: Power Core",type:"Raid"});
npcCollection.push({name:"Bizarro",                   location:"Fortress of Solitude: Power Core",type:"Raid"});
npcCollection.push({name:"Power Girl",                location:"Fortress of Solitude: Power Core",type:"Raid"});
npcCollection.push({name:"Alpha Stalker Triad",       location:"Fortress of Solitude: Power Core",type:"Raid"});
npcCollection.push({name:"Stalker Triad",             location:"Fortress of Solitude: Power Core",type:"Raid"});
npcCollection.push({name:"Sunstone Crystal",          location:"Fortress of Solitude: Power Core",type:"Raid"});
npcCollection.push({name:"Shard of Affliction",       location:"Fortress of Solitude: Power Core",type:"Raid"});
npcCollection.push({name:"Shard of Immunity",         location:"Fortress of Solitude: Power Core",type:"Raid"});
npcCollection.push({name:"Shard of Restoration",      location:"Fortress of Solitude: Power Core",type:"Raid"});
npcCollection.push({name:"Sunstone Mech",             location:"Fortress of Solitude: Power Core",type:"Raid"});
npcCollection.push({name:"Sunstone Fortifier",        location:"Fortress of Solitude: Power Core",type:"Raid"});

npcCollection.push({name:"Kryptonian Medic",          location:"Fortress of Solitude: Sunstone Matrix",type:"Raid"});
npcCollection.push({name:"Kryptonian Sniper",         location:"Fortress of Solitude: Sunstone Matrix",type:"Raid"});
npcCollection.push({name:"Kryptonian Infantry",       location:"Fortress of Solitude: Sunstone Matrix",type:"Raid"});
npcCollection.push({name:"Ursa",                      location:"Fortress of Solitude: Sunstone Matrix",type:"Raid"});
npcCollection.push({name:"Non",                       location:"Fortress of Solitude: Sunstone Matrix",type:"Raid"});
npcCollection.push({name:"General Zod",               location:"Fortress of Solitude: Sunstone Matrix",type:"Raid"});
npcCollection.push({name:"Sunstone Sentry",           location:"Fortress of Solitude: Sunstone Matrix",type:"Raid"});

npcCollection.push({name:"Avatar of Magic",           location:"Themyscira: The Gates of Tartarus",type:"Raid"});
npcCollection.push({name:"Brainiac Bounder",          location:"Themyscira: The Gates of Tartarus",type:"Raid"});
npcCollection.push({name:"Brainiac Swarm Master",     location:"Themyscira: The Gates of Tartarus",type:"Raid"});
npcCollection.push({name:"Brainiac Swarmer",          location:"Themyscira: The Gates of Tartarus",type:"Raid"});
npcCollection.push({name:"Brainiac Vanquisher",       location:"Themyscira: The Gates of Tartarus",type:"Raid"});
npcCollection.push({name:"Brainiac Reaver",           location:"Themyscira: The Gates of Tartarus",type:"Raid"});
npcCollection.push({name:"Astral Lion",               location:"Themyscira: The Gates of Tartarus",type:"Raid"});
npcCollection.push({name:"Astral Roc",                location:"Themyscira: The Gates of Tartarus",type:"Raid"});
npcCollection.push({name:"Possessed Statue",          location:"Themyscira: The Gates of Tartarus",type:"Raid"});
npcCollection.push({name:"Brainiac Ravager",          location:"Themyscira: The Gates of Tartarus",type:"Raid"});
npcCollection.push({name:"Avatar Guardian",           location:"Themyscira: The Gates of Tartarus",type:"Raid"});
npcCollection.push({name:"Brainiac Restrainer",       location:"Themyscira: The Gates of Tartarus",type:"Raid"});
npcCollection.push({name:"Brainiac Arachnid",         location:"Themyscira: The Gates of Tartarus",type:"Raid"});
npcCollection.push({name:"Brainiac Shredder",         location:"Themyscira: The Gates of Tartarus",type:"Raid"});
npcCollection.push({name:"Brainiac Prime Actuator",   location:"Themyscira: The Gates of Tartarus",type:"Raid"});
npcCollection.push({name:"Brainiac Shifter",          location:"Themyscira: The Gates of Tartarus",type:"Raid"});
npcCollection.push({name:"Colossal General",          location:"Themyscira: The Gates of Tartarus",type:"Raid"});
npcCollection.push({name:"Colossal Archer",           location:"Themyscira: The Gates of Tartarus",type:"Raid"});

npcCollection.push({name:"Prime Avatar of Meta",      location:"Prime Battleground",type:"Raid"});
npcCollection.push({name:"Prime Avatar of Magic",     location:"Prime Battleground",type:"Raid"});
npcCollection.push({name:"Prime Avatar of Tech",      location:"Prime Battleground",type:"Raid"});

npcCollection.push({name:"Bludhaven Avenger",        location:"Bludhaven",type:"Alert"});
npcCollection.push({name:"Chemo",                    location:"Bludhaven",type:"Alert"});
npcCollection.push({name:"Major Force",              location:"Bludhaven",type:"Alert"});
npcCollection.push({name:"Psionic Illusion",         location:"Bludhaven",type:"Alert"});
npcCollection.push({name:"Half Mutant",              location:"Bludhaven",type:"Alert"});
npcCollection.push({name:"Mutant Alligator",         location:"Bludhaven",type:"Alert"});
npcCollection.push({name:"Cryo Chemoid",             location:"Bludhaven",type:"Alert"});
npcCollection.push({name:"Pyro Chemoid",             location:"Bludhaven",type:"Alert"});
npcCollection.push({name:"Medic Chemo",              location:"Bludhaven", type:"Alert", level:30, species:"Mutant"});
npcCollection.push({name:"Chemoid",                  location:"Bludhaven", type:"Alert", level:30, species:"Mutant"});

npcCollection.push({name:"Bean",                     location:"Gorilla Island",type:"Alert"});
npcCollection.push({name:"Furious George",           location:"Gorilla Island",type:"Alert"});
npcCollection.push({name:"Tiny",                     location:"Gorilla Island",type:"Alert"});
npcCollection.push({name:"UGA Commander",            location:"Gorilla Island",type:"Alert"});
npcCollection.push({name:"UGA Commando",             location:"Gorilla Island",type:"Alert"});
npcCollection.push({name:"UGA Elite Guard",          location:"Gorilla Island",type:"Alert"});
npcCollection.push({name:"UGA Soldier",              location:"Gorilla Island",type:"Alert"});
npcCollection.push({name:"Ultra-Humanite",           location:"Gorilla Island",type:"Alert"});

npcCollection.push({name:"Buzzbomber",               location:"Hive Moon Base",type:"Alert"});
npcCollection.push({name:"Buzzbomber ",              location:"Hive Moon Base",type:"Alert"});
npcCollection.push({name:"Guard Captain Bombus",     location:"Hive Moon Base",type:"Alert"});
npcCollection.push({name:"HIVE Interceptor",         location:"Hive Moon Base",type:"Alert"});
npcCollection.push({name:"Queen Bee",                location:"Hive Moon Base",type:"Alert"});
npcCollection.push({name:"Royal Drone",              location:"Hive Moon Base",type:"Alert"});
npcCollection.push({name:"Elite Buzzbomber",         location:"Hive Moon Base",type:"Alert"});
npcCollection.push({name:"Chief Engineer Wolzie",    location:"Hive Moon Base",type:"Alert"});
npcCollection.push({name:"Captain Buzzzcutt",        location:"Hive Moon Base",type:"Alert"});
npcCollection.push({name:"Dive Bomber",              location:"Hive Moon Base",type:"Alert"});
npcCollection.push({name:"Killer Bee",               location:"Hive Moon Base",type:"Alert"});
npcCollection.push({name:"HIVE Prisoner",            location:"Hive Moon Base",type:"Alert"});
npcCollection.push({name:"Royal Guardsman",          location:"Hive Moon Base",type:"Alert"});
npcCollection.push({name:"Stinger",                  location:"Hive Moon Base",type:"Alert"});
npcCollection.push({name:"Stinger Sentry",           location:"Hive Moon Base",type:"Alert"});
npcCollection.push({name:"Evolved Guardsman",        location:"Hive Moon Base",type:"Alert"});
npcCollection.push({name:"Harvester Technician",     location:"Hive Moon Base",type:"Alert"});
npcCollection.push({name:"Refinery Guard",           location:"Hive Moon Base",type:"Alert"});
npcCollection.push({name:"Starport Guard",           location:"Hive Moon Base",type:"Alert"});
npcCollection.push({name:"Starport Worker",          location:"Hive Moon Base",type:"Alert"});
npcCollection.push({name:"Elite Royal Guardsman",    location:"Hive Moon Base",type:"Alert"})
npcCollection.push({name:"Major Honeygut",           location:"Hive Moon Base",type:"Alert"})
npcCollection.push({name:"Forager",                  location:"Hive Moon Base",type:"Alert"})
npcCollection.push({name:"Mortuary Bee",             location:"Hive Moon Base",type:"Alert"})
npcCollection.push({name:"Hologram",                 location:"Hive Moon Base",type:"Alert"})
npcCollection.push({name:"Booster Gold",             location:"Hive Moon Base",type:"Alert"})
npcCollection.push({name:"Captain Bumble",           location:"Hive Moon Base",type:"Alert"})

npcCollection.push({name:"Altered Android",          location:"Oolong Island",type:"Alert"});
npcCollection.push({name:"Hyperactive Android",      location:"Oolong Island",type:"Alert"});
npcCollection.push({name:"Security Android",         location:"Oolong Island",type:"Alert"});
npcCollection.push({name:"Android",                  location:"Oolong Island",type:"Alert"});
npcCollection.push({name:"Chang Tzu",                location:"Oolong Island",type:"Alert"});
npcCollection.push({name:"Enraged Metal Man",        location:"Oolong Island",type:"Alert"});
npcCollection.push({name:"Failed Metal Man",         location:"Oolong Island",type:"Alert"});
npcCollection.push({name:"Metalman A-7",             location:"Oolong Island",type:"Alert"});
npcCollection.push({name:"Micro Security Bot",       location:"Oolong Island",type:"Alert"});
npcCollection.push({name:"Oolong Enforcer",          location:"Oolong Island",type:"Alert"});
npcCollection.push({name:"Tornado Tyrant",           location:"Oolong Island",type:"Alert", level:20, species:"Mechanical"});
npcCollection.push({name:"Pterosaur",                location:"Oolong Island",type:"Alert", level:30, species:"Beast"});
npcCollection.push({name:"Berserk Pterosaur",        location:"Oolong Island",type:"Alert", level:30, species:"Beast"});
npcCollection.push({name:"Laboratory Security",      location:"Oolong Island",type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Laboratory Guard",         location:"Oolong Island",type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Chang Tzu Personal Guard", location:"Oolong Island",type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Chang Tzu Personal Healer",location:"Oolong Island",type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Doctor Pyrate",            location:"Oolong Island",type:"Alert", level:30, species:"Mechanical"});
npcCollection.push({name:"Hatchling",                location:"Oolong Island",type:"Alert", level:30, species:"Mechanical"});

npcCollection.push({name:"Bane",                     location:"Gotham Old Subway",type:"Challenge", level:30, species:"Humanoid"});
npcCollection.push({name:"Hush",                     location:"Gotham Old Subway",type:"Challenge", level:30, species:"Humanoid"});
npcCollection.push({name:"Louie Slugger",            location:"Gotham Old Subway",type:"Challenge", level:30, species:"Humanoid"});
npcCollection.push({name:"Machine Gun Tommy",        location:"Gotham Old Subway",type:"Challenge", level:30, species:"Humanoid"});
npcCollection.push({name:"Nicki Blades",             location:"Gotham Old Subway",type:"Challenge", level:30, species:"Humanoid"});
npcCollection.push({name:"Pengbot Maximus",          location:"Gotham Old Subway",type:"Challenge", level:30, species:"Mechanical"});
npcCollection.push({name:"Penguin",                  location:"Gotham Old Subway",type:"Challenge", level:30, species:"Humanoid"});
npcCollection.push({name:"Two-Face Henchman",        location:"Gotham Old Subway",type:"Challenge", level:30, species:"Humanoid"});
npcCollection.push({name:"Tammy Two Guns",           location:"Gotham Old Subway",type:"Challenge", level:30, species:"Humanoid"});
npcCollection.push({name:"Pyro Pengbot",             location:"Gotham Old Subway",type:"Challenge", level:30, species:"Mechanical"});

npcCollection.push({name:"Catwoman",                 location:"Gotham University Warehouse",type:"Challenge", level:30, species:"Humanoid"});
npcCollection.push({name:"Cheetah Claw",             location:"Gotham University Warehouse",type:"Challenge", level:30, species:"Beast"});
npcCollection.push({name:"Cheetah Lord",             location:"Gotham University Warehouse",type:"Challenge", level:30, species:"Beast"});
npcCollection.push({name:"Lion Lady",                location:"Gotham University Warehouse",type:"Challenge", level:30, species:"Beast"});
npcCollection.push({name:"Lion Lord",                location:"Gotham University Warehouse",type:"Challenge", level:30, species:"Beast"});
npcCollection.push({name:"Lion Mane",                location:"Gotham University Warehouse",type:"Challenge", level:30, species:"Beast"});
npcCollection.push({name:"Panther Fang",             location:"Gotham University Warehouse",type:"Challenge", level:30, species:"Beast"});
npcCollection.push({name:"Panther Lord",             location:"Gotham University Warehouse",type:"Challenge", level:30, species:"Beast"});
npcCollection.push({name:"Tiger Eye",                location:"Gotham University Warehouse",type:"Challenge", level:30, species:"Beast"});
npcCollection.push({name:"Tiger Lord",               location:"Gotham University Warehouse",type:"Challenge", level:30, species:"Beast"});
npcCollection.push({name:"Tiger Cub",                location:"Gotham University Warehouse",type:"Challenge", level:30, species:"Beast"});

npcCollection.push({name:"Harley Quinn",             location:"Joker's Funhouse",type:"Challenge", level:30, species:"Humanoid"});
npcCollection.push({name:"Lefty",                    location:"Joker's Funhouse",type:"Challenge", level:30, species:"Humanoid"});
npcCollection.push({name:"Righty",                   location:"Joker's Funhouse",type:"Challenge", level:30, species:"Humanoid"});
npcCollection.push({name:"Lunatic",                  location:"Joker's Funhouse",type:"Challenge", level:30, species:"Humanoid"});
npcCollection.push({name:"Wisecracker",              location:"Joker's Funhouse",type:"Challenge", level:30, species:"Humanoid"});
npcCollection.push({name:"Madcap",                   location:"Joker's Funhouse",type:"Challenge", level:30, species:"Humanoid"});
npcCollection.push({name:"Stooge",                   location:"Joker's Funhouse",type:"Challenge", level:30, species:"Humanoid"});

npcCollection.push({name:"Eclipso",                  location:"Lair of the Spectre",type:"Challenge", level:30, species:"Spirit"});
npcCollection.push({name:"Magistrate",               location:"Lair of the Spectre",type:"Challenge", level:30, species:"Spirit"});
npcCollection.push({name:"Vengeful Spirit",          location:"Lair of the Spectre",type:"Challenge", level:30, species:"Spirit"});
npcCollection.push({name:"Accuser",                  location:"Lair of the Spectre",type:"Challenge", level:30, species:"Spirit"});
npcCollection.push({name:"The Spectre",              location:"Lair of the Spectre",type:"Challenge", level:30, species:"Spirit"});
npcCollection.push({name:"Green Arrow",              location:"Lair of the Spectre",type:"Challenge", level:30, species:"Humanoid"});
npcCollection.push({name:"Green Lantern",            location:"Lair of the Spectre",type:"Challenge", level:30, species:"Humanoid"});
npcCollection.push({name:"Souleater",                location:"Lair of the Spectre",type:"Challenge", level:30, species:"Spirit"});

npcCollection.push({name:"Felix Faust",              location:"Mannheim's Chinese Theater",type:"Challenge", level:30, species:"Humanoid"});
npcCollection.push({name:"Magent Neophyte",          location:"Mannheim's Chinese Theater",type:"Challenge", level:30, species:"Humanoid"});
npcCollection.push({name:"Soulless Thrall",          location:"Mannheim's Chinese Theater",type:"Challenge", level:30, species:"Undead"});
npcCollection.push({name:"Wizard Magent",            location:"Mannheim's Chinese Theater",type:"Challenge", level:30, species:"Humanoid"});
npcCollection.push({name:"Zatanna",                  location:"Mannheim's Chinese Theater",type:"Challenge", level:30, species:"Humanoid"});
npcCollection.push({name:"Apprentice Magent",        location:"Mannheim's Chinese Theater",type:"Challenge", level:30, species:"Humanoid"});

npcCollection.push({name:"Doctor Psycho",                  location:"Meta Research Wing",type:"Challenge", level:30, species:"Humanoid"});
npcCollection.push({name:"Hallucination of Doctor Psycho", location:"Meta Research Wing",type:"Challenge", level:30, species:"Spirit"});
npcCollection.push({name:"Confused Patient",               location:"Meta Research Wing",type:"Challenge", level:30, species:"Humanoid"});
npcCollection.push({name:"Enraged Patient",                location:"Meta Research Wing",type:"Challenge", level:30, species:"Humanoid"});
npcCollection.push({name:"Security Captain",               location:"Meta Research Wing",type:"Challenge", level:30, species:"Humanoid"});
npcCollection.push({name:"Security Officer",               location:"Meta Research Wing",type:"Challenge", level:30, species:"Humanoid"});
npcCollection.push({name:"Security Agent",                 location:"Meta Research Wing",type:"Challenge", level:30, species:"Humanoid"});

npcCollection.push({name:"MPD Officer",              location:"Metropolis University",type:"Challenge", level:30, species:"Humanoid"});
npcCollection.push({name:"Rookie",                   location:"Metropolis University",type:"Challenge", level:30, species:"Humanoid"});
npcCollection.push({name:"Sigma",                    location:"Metropolis University",type:"Challenge", level:30, species:"Humanoid"});

npcCollection.push({name:"Epsilon",                  location:"Science Police HQ",type:"Challenge", level:30, species:"Humanoid"});
npcCollection.push({name:"Possessed Raven Spirit",   location:"Science Police HQ",type:"Challenge", level:30, species:"Demon"});
npcCollection.push({name:"Psi-Nu",                   location:"Science Police HQ",type:"Challenge", level:30, species:"Humanoid"});
npcCollection.push({name:"Soul Reaver",              location:"Science Police HQ",type:"Challenge", level:30, species:"Demon"});
npcCollection.push({name:"Soul Scream",              location:"Science Police HQ",type:"Challenge", level:30, species:"Demon"});
npcCollection.push({name:"Soul Striker",             location:"Science Police HQ",type:"Challenge", level:30, species:"Demon"});
npcCollection.push({name:"Demon",                    location:"Science Police HQ",type:"Challenge", level:30, species:"Demon"});
npcCollection.push({name:"Spirit of Raven",          location:"Science Police HQ",type:"Challenge", level:30, species:"Demon"});
npcCollection.push({name:"Theta",                    location:"Science Police HQ",type:"Challenge", level:30, species:"Humanoid"});
npcCollection.push({name:"Upsilon",                  location:"Science Police HQ",type:"Challenge", level:30, species:"Humanoid"});
npcCollection.push({name:"Xi-Rho",                   location:"Science Police HQ",type:"Challenge", level:30, species:"Humanoid"});
npcCollection.push({name:"Cyborg",                   location:"Science Police HQ",type:"Challenge", level:30, species:"Humanoid"});
npcCollection.push({name:"Starfire",                 location:"Science Police HQ",type:"Challenge", level:30, species:"Humanoid"});
npcCollection.push({name:"Donna Troy",               location:"Science Police HQ",type:"Challenge", level:30, species:"Humanoid"});

npcCollection.push({name:"Doctor Fate",              location:"Sentinels of Magic Citadel",type:"Challenge", level:30, species:"Humanoid"});
npcCollection.push({name:"Initiate",                 location:"Sentinels of Magic Citadel",type:"Challenge", level:30, species:"Humanoid"});
npcCollection.push({name:"Sentry",                   location:"Sentinels of Magic Citadel",type:"Challenge", level:30, species:"Humanoid"});
npcCollection.push({name:"Vanguard",                 location:"Sentinels of Magic Citadel",type:"Challenge", level:30, species:"Humanoid"});
npcCollection.push({name:"Ancient Bloodroot",        location:"The Greenhouse",type:"Challenge", level:30, species:"Plant"});
npcCollection.push({name:"Bloodroot Sapling",        location:"The Greenhouse",type:"Challenge", level:30, species:"Plant"});
npcCollection.push({name:"Sequoia Lord",             location:"The Greenhouse",type:"Challenge", level:30, species:"Plant"});
npcCollection.push({name:"Archer Major",             location:"Chinatown Cafe",type:"Instance", level:15, species:"Humanoid"});
npcCollection.push({name:"Archer Minor",             location:"Chinatown Cafe",type:"Instance", level:15, species:"Humanoid"});
npcCollection.push({name:"Bestiamorph Berserker",    location:"Chinatown Cafe",type:"Instance", level:15, species:"Beast"});
npcCollection.push({name:"Bestiamorph Marauder",     location:"Chinatown Cafe",type:"Instance", level:15, species:"Beast"});
npcCollection.push({name:"Bestiamorph Ravener",      location:"Chinatown Cafe",type:"Instance", level:15, species:"Beast"});
npcCollection.push({name:"Circe",                    location:"Chinatown Cafe",type:"Instance", level:15, species:"Humanoid"});
npcCollection.push({name:"Hoplite Minor",            location:"Chinatown Cafe",type:"Instance", level:15, species:"Humanoid"});
npcCollection.push({name:"Hoplite Major",            location:"Chinatown Cafe",type:"Instance", level:15, species:"Humanoid"});
npcCollection.push({name:"Hoplite Spearmaiden",      location:"Chinatown Cafe",type:"Instance", level:15, species:"Humanoid"});
npcCollection.push({name:"Wonder Woman",             location:"Chinatown Cafe",type:"Instance", level:15, species:"Humanoid"});
npcCollection.push({name:"Kitefin",                  location:"Condemned Shipping Office",type:"Instance", level:26, species:"Aquatic"});
npcCollection.push({name:"Mako",                     location:"Condemned Shipping Office",type:"Instance", level:26, species:"Aquatic"});
npcCollection.push({name:"Sandtiger",                location:"Condemned Shipping Office",type:"Instance", level:26, species:"Aquatic"});
npcCollection.push({name:"Thresher",                 location:"Condemned Shipping Office",type:"Instance", level:26, species:"Aquatic"});
npcCollection.push({name:"Tigershark",               location:"Condemned Shipping Office",type:"Instance", level:26, species:"Aquatic"});
npcCollection.push({name:"Whitetip",                 location:"Condemned Shipping Office",type:"Instance", level:26, species:"Aquatic"});

npcCollection.push({name:"Brother Blood",            location:"Ellsworth Memorial Hospital",type:"Instance", level:18, species:"Humanoid"});
npcCollection.push({name:"Minion of Gluttony",       location:"Ellsworth Memorial Hospital",type:"Instance", level:18, species:"Demon"});
npcCollection.push({name:"Minion of Greed",          location:"Ellsworth Memorial Hospital",type:"Instance", level:18, species:"Demon"});
npcCollection.push({name:"Minion of Wrath",          location:"Ellsworth Memorial Hospital",type:"Instance", level:18, species:"Demon"});
npcCollection.push({name:"Minion of Sloth",          location:"Ellsworth Memorial Hospital",type:"Instance", level:18, species:"Demon"});
npcCollection.push({name:"Minion of Lust",           location:"Ellsworth Memorial Hospital",type:"Instance", level:18, species:"Demon"});
npcCollection.push({name:"Embodiment of Sin",        location:"Ellsworth Memorial Hospital",type:"Instance", level:18, species:"Demon"});
npcCollection.push({name:"Wrathful Metahuman",       location:"Ellsworth Memorial Hospital",type:"Instance", level:18, species:"Demon"});
npcCollection.push({name:"Exarch of Gluttony",       location:"Ellsworth Memorial Hospital",type:"Instance", level:18, species:"Demon"});
npcCollection.push({name:"Exarch of Wrath",          location:"Ellsworth Memorial Hospital",type:"Instance", level:18, species:"Demon"});

npcCollection.push({name:"Devolved Citizen",         location:"Gorilla Grodd's Lab", type:"Instance", level:6, species:"Beast"});
npcCollection.push({name:"Gorilla Grenadier",        location:"Gorilla Grodd's Lab", type:"Instance", level:6, species:"Beast"});
npcCollection.push({name:"Gorilla Grodd",            location:"Gorilla Grodd's Lab", type:"Instance", level:6, species:"Beast"});
npcCollection.push({name:"Gorilla Marksman",         location:"Gorilla Grodd's Lab", type:"Instance", level:6, species:"Beast"});
npcCollection.push({name:"Gorilla Smasher",          location:"Gorilla Grodd's Lab", type:"Instance", level:6, species:"Beast"});
npcCollection.push({name:"Gorilla Technician",       location:"Gorilla Grodd's Lab", type:"Instance", level:6, species:"Beast"});
npcCollection.push({name:"Gorilla Trooper",          location:"Gorilla Grodd's Lab", type:"Instance", level:6, species:"Beast"});

npcCollection.push({name:"Psycho-Spinner",       location:"Arkham Asylum", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Charmed Guard",        location:"Arkham Asylum", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Charmed Inmate",       location:"Arkham Asylum", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Ice Pick",             location:"Arkham Asylum", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Mister Freeze",        location:"Arkham Asylum", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Poison Ivy",           location:"Arkham Asylum", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Scarecrow",            location:"Arkham Asylum", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Venus Flytrap",        location:"Arkham Asylum", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Ice Breaker",          location:"Arkham Asylum", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Arkham Guard",         location:"Arkham Asylum", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Spore",                location:"Arkham Asylum", type:"Alert", level:30, species:"Plant"});
npcCollection.push({name:"Inmate",               location:"Arkham Asylum", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Charmed Doctor",       location:"Arkham Asylum", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Lunatic Inmate",       location:"Arkham Asylum", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Death Blossom",        location:"Arkham Asylum", type:"Alert", level:30, species:"Plant"});
npcCollection.push({name:"Terrified Guard",      location:"Arkham Asylum", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Spectral Nightmare",   location:"Arkham Asylum", type:"Alert", level:30, species:"Spirit"});
npcCollection.push({name:"Terrified Inmate",     location:"Arkham Asylum", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Thorn",                location:"Arkham Asylum", type:"Alert", level:30, species:"Plant"});
npcCollection.push({name:"Mandrake",             location:"Arkham Asylum", type:"Alert", level:30, species:"Plant"});
npcCollection.push({name:"Mandrake Burster",     location:"Arkham Asylum", type:"Alert", level:30, species:"Plant"});
npcCollection.push({name:"Gallows Oak",          location:"Arkham Asylum", type:"Alert", level:30, species:"Plant"});
npcCollection.push({name:"Gallows Oak Guardian", location:"Arkham Asylum", type:"Alert", level:30, species:"Plant"});
npcCollection.push({name:"Gallows Oak Sapling",  location:"Arkham Asylum", type:"Alert", level:30, species:"Plant"});
npcCollection.push({name:"Hallucination",        location:"Arkham Asylum", type:"Alert", level:30, species:"Spirit"});
npcCollection.push({name:"Doctor Alyce Sinner",  location:"Arkham Asylum", type:"Alert", level:30, species:"Spirit"});
npcCollection.push({name:"Crazed Cooler",        location:"Arkham Asylum", type:"Alert", level:30, species:"Humanoid"});

npcCollection.push({name:"Ace Patrolman",        location:"Ace Chemicals", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Ace Security Guard",   location:"Ace Chemicals", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Ace Technician",       location:"Ace Chemicals", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Babyface",             location:"Ace Chemicals", type:"Alert", level:30, species:"Mechanic"});
npcCollection.push({name:"Clownsanity",          location:"Ace Chemicals", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Experiment 037",       location:"Ace Chemicals", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Experiment 505",     location:"Ace Chemicals", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Guard Dog",          location:"Ace Chemicals", type:"Alert", level:30, species:"Beast"});
npcCollection.push({name:"Punchline",          location:"Ace Chemicals", type:"Alert", level:30, species:"Mechanic"});
npcCollection.push({name:"Sludge Thing",       location:"Ace Chemicals", type:"Alert", level:30, species:"Mutant"});
npcCollection.push({name:"Sludgeling",         location:"Ace Chemicals", type:"Alert", level:30, species:"Mutant"});
npcCollection.push({name:"Ferrous Fool",       location:"Ace Chemicals", type:"Alert", level:30, species:"Mechanic"});
npcCollection.push({name:"Mercury Mummer",     location:"Ace Chemicals", type:"Alert", level:30, species:"Mechanic"});
npcCollection.push({name:"Amusing Alloy",      location:"Ace Chemicals", type:"Alert", level:30, species:"Mechanic"});
npcCollection.push({name:"Comic Gold",         location:"Ace Chemicals", type:"Alert", level:30, species:"Mechanic"});
npcCollection.push({name:"Watchman Duncan",    location:"Ace Chemicals", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Watchdog Rinty",     location:"Ace Chemicals", type:"Alert", level:30, species:"Beast"});
npcCollection.push({name:"Phosphorus Chemoid", location:"Ace Chemicals", type:"Alert", level:30, species:"Mutant"});
npcCollection.push({name:"Nitrogen Chemoid",   location:"Ace Chemicals", type:"Alert", level:30, species:"Mutant"});
npcCollection.push({name:"Uranium Chemoid",    location:"Ace Chemicals", type:"Alert", level:30, species:"Mutant"});
npcCollection.push({name:"Chemling",           location:"Ace Chemicals", type:"Alert", level:30, species:"Mutant"});
npcCollection.push({name:"Mutant",             location:"Ace Chemicals", type:"Alert", level:30, species:"Mutant"});

npcCollection.push({name:"Assassin Master",    location:"League of Assassins Stronghold", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Blade Dancer",       location:"League of Assassins Stronghold", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Bolt Claw",          location:"League of Assassins Stronghold", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Burning Claw",       location:"League of Assassins Stronghold", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Lying Claw",         location:"League of Assassins Stronghold", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Power Fist",         location:"League of Assassins Stronghold", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Power Strike",       location:"League of Assassins Stronghold", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Ra's Al Ghul",       location:"League of Assassins Stronghold", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Serpent Claw",       location:"League of Assassins Stronghold", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Staff Master",       location:"League of Assassins Stronghold", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Psionic Duplicate",  location:"League of Assassins Stronghold", type:"Alert", level:30, species:"Spirit"});

npcCollection.push({name:"Berserker",            location:"Oan Sciencecells", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Enrager",              location:"Oan Sciencecells", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Evil Star",            location:"Oan Sciencecells", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Fear Constructor",     location:"Oan Sciencecells", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Guy Gardner",          location:"Oan Sciencecells", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Hungerer",             location:"Oan Sciencecells", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Krona",                location:"Oan Sciencecells", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Lantern Eliminator",   location:"Oan Sciencecells", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Lyssa Drak",           location:"Oan Sciencecells", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Manhunter Clasher",    location:"Oan Sciencecells", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Manhunter Elite",      location:"Oan Sciencecells", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Manhunter Enforcer",   location:"Oan Sciencecells", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Qwardian Thunderer",   location:"Oan Sciencecells", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Qwardian Weaponer",    location:"Oan Sciencecells", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Vice",                 location:"Oan Sciencecells", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Predator",             location:"Oan Sciencecells", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Hellion",              location:"Oan Sciencecells", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"General Fabrikant",    location:"Oan Sciencecells", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Space Mutant",         location:"Oan Sciencecells", type:"Alert", level:30, species:"Mutant"});
npcCollection.push({name:"Starling",             location:"Oan Sciencecells", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Disgorger",            location:"Oan Sciencecells", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Fear Drudge",          location:"Oan Sciencecells", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Specialist",           location:"Oan Sciencecells", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Alpha Lantern",        location:"Oan Sciencecells", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Alpha Lantern Leader", location:"Oan Sciencecells", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Terror Surgeon",       location:"Oan Sciencecells", type:"Alert", level:30, species:"Humanoid"});

npcCollection.push({name:"Atrocitus",                        location:"Coast City", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Crazed Amon Sur",                  location:"Coast City", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Kyle Rayner",                      location:"Coast City", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Provoker",                         location:"Coast City", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Inciter",                          location:"Coast City", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Ferocity",                         location:"Coast City", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Hard Light Reinforcer",            location:"Coast City", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Elite Brainiac Assassin",          location:"Coast City", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Crazed Sinestro Corps Lieutenant", location:"Coast City", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Crazed Light Carver",              location:"Coast City", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Crazed Lantern Eliminator",        location:"Coast City", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Crazed Fear Drudge",               location:"Coast City", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Willful Recruit",                  location:"Coast City", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Willful Medic",                    location:"Coast City", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Willful Lantern Ranger",           location:"Coast City", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Willful Ringslinger",              location:"Coast City", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Willful Assault Guard",            location:"Coast City", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Kyle Rayner Construct",            location:"Coast City", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Enrager",                          location:"Coast City", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Enraged Berserker",                location:"Coast City", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Ring Fury",                        location:"Coast City", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Ferris Mechanic",                  location:"Coast City", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Pterosaur Construct",              location:"Coast City", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Nightmare Construct",              location:"Coast City", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Terror Construct",                 location:"Coast City", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Enforcer Construct",               location:"Coast City", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Willpower Construct",              location:"Coast City", type:"Alert", level:30, species:"Humanoid"});

npcCollection.push({name:"Parallax",                         location:"STAR Labs Research Facility", type:"Alert", level:30, species:"Spirit"});
npcCollection.push({name:"Scion of Fear",                    location:"STAR Labs Research Facility", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Scion of Will",                    location:"STAR Labs Research Facility", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Hal Jordan",                       location:"STAR Labs Research Facility", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Sinestro",                         location:"STAR Labs Research Facility", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Arkillo",                          location:"STAR Labs Research Facility", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Kilowog",                          location:"STAR Labs Research Facility", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Spark Slicer",                     location:"STAR Labs Research Facility", type:"Alert", level:30, species:"Mechanical"});
npcCollection.push({name:"Devourer",                         location:"STAR Labs Research Facility", type:"Alert", level:30, species:"Mechanical"});
npcCollection.push({name:"Slicer Splitter",                  location:"STAR Labs Research Facility", type:"Alert", level:30, species:"Mechanical"});
npcCollection.push({name:"Spark Sniper",                     location:"STAR Labs Research Facility", type:"Alert", level:30, species:"Mechanical"});
npcCollection.push({name:"Incursion Commander",              location:"STAR Labs Research Facility", type:"Alert", level:30, species:"Mechanical"});
npcCollection.push({name:"Sliceclaw",                        location:"STAR Labs Research Facility", type:"Alert", level:30, species:"Mechanical"});
npcCollection.push({name:"Warp Slayer",                      location:"STAR Labs Research Facility", type:"Alert", level:30, species:"Mechanical"});
npcCollection.push({name:"Progeny of Fear",                  location:"STAR Labs Research Facility", type:"Alert", level:30, species:"Mechanical"});
npcCollection.push({name:"Progeny of Will",                  location:"STAR Labs Research Facility", type:"Alert", level:30, species:"Mechanical"});
npcCollection.push({name:"Slicer Spawner",                   location:"STAR Labs Research Facility", type:"Alert", level:30, species:"Mechanical"});
npcCollection.push({name:"Manhunter",                        location:"STAR Labs Research Facility", type:"Alert", level:30, species:"Mechanical"});

npcCollection.push({name:"Lasher",              location:"Stryker's Island Penitentiary", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Thornrot",            location:"Stryker's Island Penitentiary", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Meta-powered Inmate", location:"Stryker's Island Penitentiary", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Burster",             location:"Stryker's Island Penitentiary", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Stormer",             location:"Stryker's Island Penitentiary", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Heatwave",            location:"Stryker's Island Penitentiary", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Rioting Prisoner",    location:"Stryker's Island Penitentiary", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Mirror Master",       location:"Stryker's Island Penitentiary", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Ripsaw",              location:"Stryker's Island Penitentiary", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Prison Guard",        location:"Stryker's Island Penitentiary", type:"Alert", level:30, species:"Humanoid"});

npcCollection.push({name:"Doomclone Citizen",         location:"Smallville", type:"Alert", level:30, species:"Mutant"});
npcCollection.push({name:"Doomcrazed Citizen",        location:"Smallville", type:"Alert", level:30, species:"Mutant"});
npcCollection.push({name:"Doomcrazed Giant",          location:"Smallville", type:"Alert", level:30, species:"Mutant"});
npcCollection.push({name:"Doomcrazed Guard",          location:"Smallville", type:"Alert", level:30, species:"Mutant"});
npcCollection.push({name:"Doomsday",                  location:"Smallville", type:"Alert", level:30, species:"Mutant"});
npcCollection.push({name:"Doctor Richards",           location:"Smallville", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Dr. Richards",              location:"Smallville", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Frenzied Citizen",          location:"Smallville", type:"Alert", level:30, species:"Mutant"});
npcCollection.push({name:"Lady Doombringer",          location:"Smallville", type:"Alert", level:30, species:"Mutant"});
npcCollection.push({name:"Lexcorp Scientist",         location:"Smallville", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Rampaging citizen",         location:"Smallville", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Berserk Citizen",           location:"Smallville", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Doomformed Citizen",        location:"Smallville", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Enraged Doomfused Citizen", location:"Smallville", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Guardian",                  location:"Smallville", type:"Alert", level:30, species:"Humanoid"});

npcCollection.push({name:"System Hacker",       location:"Watchtower Containment Facility", type:"Alert", level:30, species:"Mechanical"});
npcCollection.push({name:"Eradicator",          location:"Watchtower Containment Facility", type:"Alert", level:30, species:"Mechanical"});
npcCollection.push({name:"Eradicator Drone",    location:"Watchtower Containment Facility", type:"Alert", level:30, species:"Mechanical"});
npcCollection.push({name:"Security Guard",      location:"Watchtower Containment Facility", type:"Alert", level:30, species:"Humanoid"});
npcCollection.push({name:"Prince Ulgo",         location:"Watchtower Containment Facility", type:"Alert", level:30, species:"Beast"});
npcCollection.push({name:"Brainiac Abbetor",    location:"Watchtower Containment Facility", type:"Alert", level:30, species:"Mechanical"});
npcCollection.push({name:"Neurostriker",        location:"Watchtower Containment Facility", type:"Alert", level:30, species:"Mechanical"});
npcCollection.push({name:"Adherent",            location:"Watchtower Containment Facility", type:"Alert", level:30, species:"Mechanical"});
npcCollection.push({name:"Neuromite",           location:"Watchtower Containment Facility", type:"Alert", level:30, species:"Mechanical"});
npcCollection.push({name:"Neurocrawler",        location:"Watchtower Containment Facility", type:"Alert", level:30, species:"Mechanical"});
npcCollection.push({name:"Servitor",            location:"Watchtower Containment Facility", type:"Alert", level:30, species:"Mechanical"});

npcCollection.push({name:"Envenomed Guard Dog",           location:"Cape Carmine Lighthouse", type:"Duo", level:30, species:"Beast"});
npcCollection.push({name:"Envenomed Strongman",           location:"Cape Carmine Lighthouse", type:"Duo", level:30, species:"Humanoid"});
npcCollection.push({name:"Juicer",                        location:"Cape Carmine Lighthouse", type:"Duo", level:30, species:"Humanoid"});
npcCollection.push({name:"Razor",                         location:"Cape Carmine Lighthouse", type:"Duo", level:30, species:"Humanoid"});
npcCollection.push({name:"Strongman",                     location:"Cape Carmine Lighthouse", type:"Duo", level:30, species:"Humanoid"});
npcCollection.push({name:"Muscle",                        location:"Cape Carmine Lighthouse", type:"Duo", level:30, species:"Humanoid"});
npcCollection.push({name:"Venom Supplier Diego",          location:"Cape Carmine Lighthouse", type:"Duo", level:30, species:"Humanoid"});
npcCollection.push({name:"Killer Croc",                   location:"Cape Carmine Lighthouse", type:"Duo", level:30, species:"Humanoid"});
npcCollection.push({name:"Deathstroke",                   location:"Cape Carmine Lighthouse", type:"Duo", level:30, species:"Humanoid"});
npcCollection.push({name:"Lieutenant",                    location:"Cape Carmine Lighthouse", type:"Duo", level:30, species:"Humanoid"});
npcCollection.push({name:"Splint",                        location:"Cape Carmine Lighthouse", type:"Duo", level:30, species:"Humanoid"});
npcCollection.push({name:"Wag",                           location:"Cape Carmine Lighthouse", type:"Duo", level:30, species:"Humanoid"});

npcCollection.push({name:"Soulless Lord",                 location:"Gotham University", type:"Duo", level:30, species:"Undead"});
npcCollection.push({name:"Magent Warlock",                location:"Gotham University", type:"Duo", level:30, species:"Humanoid"});
npcCollection.push({name:"Necro Magent Gruhn",            location:"Gotham University", type:"Duo", level:30, species:"Undead"});
npcCollection.push({name:"Mummy",                         location:"Gotham University", type:"Duo", level:30, species:"Undead"});
npcCollection.push({name:"Swarm Scarab",                  location:"Gotham University", type:"Duo", level:30, species:"Undead"});
npcCollection.push({name:"Isis",                          location:"Gotham University", type:"Duo", level:30, species:"Undead"});
npcCollection.push({name:"Undead Soldier",                location:"Gotham University", type:"Duo", level:30, species:"Undead"});
npcCollection.push({name:"Magic Phylactery",              location:"Gotham University", type:"Duo", level:30, species:"Undead"});

npcCollection.push({name:"Drone",                         location:"OMAC Base", type:"Duo", level:30, species:"Mechanical"});
npcCollection.push({name:"OMAC",                          location:"OMAC Base", type:"Duo", level:30, species:"Mechanical"});
npcCollection.push({name:"OMAC Delta",                    location:"OMAC Base", type:"Duo", level:30, species:"Mechanical"});
npcCollection.push({name:"OMAC Incinerator",              location:"OMAC Base", type:"Duo", level:30, species:"Mechanical"});
npcCollection.push({name:"OMAC Nanosynth",                location:"OMAC Base", type:"Duo", level:30, species:"Mechanical"});
npcCollection.push({name:"Anti-assault Turret",           location:"OMAC Base", type:"Duo", level:30, species:"Mechanical"});
npcCollection.push({name:"OMAC Sigma",                    location:"OMAC Base", type:"Duo", level:30, species:"Mechanical"});

npcCollection.push({name:"Brainiac Accumulator",          location:"Area 51", type:"Alert", level:30, species:"Mechanical"});
npcCollection.push({name:"Brainiac Analyzer",             location:"Area 51", type:"Alert", level:30, species:"Mechanical"});
npcCollection.push({name:"Braniac Analyzer",              location:"Area 51", type:"Alert", level:30, species:"Mechanical"});
npcCollection.push({name:"Brainiac Spark",                location:"Area 51", type:"Alert", level:30, species:"Mechanical"});
npcCollection.push({name:"Brainiac Subjugator",           location:"Area 51", type:"Alert", level:30, species:"Mechanical"});
npcCollection.push({name:"Brainiac Interceptor",          location:"Area 51", type:"Alert", level:30, species:"Mechanical"});
//npcCollection.push({name:"Frenzied Spark",              location:"Area 51", type:"Alert", level:30, species:"Mechanical"});
//npcCollection.push({name:"Ultra Spark",                 location:"Area 51", type:"Alert", level:30, species:"Mechanical"});
npcCollection.push({name:"Greater Accumulator",           location:"Area 51", type:"Alert", level:30, species:"Mechanical"});
npcCollection.push({name:"Prime Servitor",                location:"Area 51", type:"Alert", level:30, species:"Mechanical"});
npcCollection.push({name:"Subprime Regulator Alpha",      location:"Area 51", type:"Alert", level:30, species:"Mechanical"});
npcCollection.push({name:"Subprime Regulator Beta",       location:"Area 51", type:"Alert", level:30, species:"Mechanical"});
npcCollection.push({name:"Subprime Regulator Zeta",       location:"Area 51", type:"Alert", level:30, species:"Mechanical"});

npcCollection.push({name:"Light Carver",       location:"Metropolis City Hall", type:"Duo", level:30, species:"Humanoid"});

npcCollection.push({name:"Balloon",              location:"Any", type:"Any", level:0, species:"Inert"});
npcCollection.push({name:"Boulder",              location:"Any", type:"Any", level:0, species:"Inert"});
npcCollection.push({name:"Crate",                location:"Any", type:"Any", level:0, species:"Inert"});
npcCollection.push({name:"Joker Present",        location:"Any", type:"Any", level:0, species:"Inert"});
npcCollection.push({name:"Missile Crate",        location:"Any", type:"Any", level:0, species:"Inert"});
npcCollection.push({name:"Concrete Slab",        location:"Any", type:"Any", level:0, species:"Inert"});
npcCollection.push({name:"Toxic Barrel",         location:"Any", type:"Any", level:0, species:"Inert"});
npcCollection.push({name:"Plasma Barrel",        location:"Any", type:"Any", level:0, species:"Inert"});
npcCollection.push({name:"Nitro Barrel",         location:"Any", type:"Any", level:0, species:"Inert"});
npcCollection.push({name:"Cyclone Barrel",       location:"Any", type:"Any", level:0, species:"Inert"});
npcCollection.push({name:"Restoration Barrel",   location:"Any", type:"Any", level:0, species:"Inert"});
npcCollection.push({name:"Fear Gas Barrel",      location:"Any", type:"Any", level:0, species:"Inert"});
npcCollection.push({name:"Exploding Barrel",     location:"Any", type:"Any", level:0, species:"Inert"});
npcCollection.push({name:"City Barrel",          location:"Any", type:"Any", level:0, species:"Inert"});
npcCollection.push({name:"Cryo Barrel",          location:"Any", type:"Any", level:0, species:"Inert"});
npcCollection.push({name:"Wooden Barrel",        location:"Any", type:"Any", level:0, species:"Inert"});
npcCollection.push({name:"Thermite Barrel",      location:"Any", type:"Any", level:0, species:"Inert"});
npcCollection.push({name:"Magic Barrel",         location:"Any", type:"Any", level:0, species:"Inert"});
npcCollection.push({name:"LexCorp Barrel",       location:"Any", type:"Any", level:0, species:"Inert"});
npcCollection.push({name:"Dynamite Barrel Bomb", location:"Any", type:"Any", level:0, species:"Inert"});
npcCollection.push({name:"HIVE Munition Crate",  location:"Any", type:"Any", level:0, species:"Inert"});
npcCollection.push({name:"Toxic Waste Drum",     location:"Any", type:"Any", level:0, species:"Inert"});
npcCollection.push({name:"Sparring Target",      location:"Any", type:"Any", level:0, species:"Inert"});
npcCollection.push({name:"ATM Machine",          location:"Any", type:"Any", level:0, species:"Inert"});
npcCollection.push({name:"[*attacker*]",         location:"Any", type:"Any", level:0, species:"Inert"});
npcCollection.push({name:"[*defender*]",         location:"Any", type:"Any", level:0, species:"Inert"});

npcCollection.push({name:"Playtime Posy",       location:"Stryker's Island", type:"Challenge", level:30, species:"Mechanical"});
npcCollection.push({name:"Beautiful Betty",     location:"Stryker's Island", type:"Challenge", level:30, species:"Mechanical"});
npcCollection.push({name:"Windup Wally",        location:"Stryker's Island", type:"Challenge", level:30, species:"Mechanical"});
npcCollection.push({name:"Buddy Barry",         location:"Stryker's Island", type:"Challenge", level:30, species:"Mechanical"});

npcCollection.push({name:"Full House",          location:"Open World", type:"Bounty", level:30, species:"Mechanical"});
npcCollection.push({name:"Solomon Grundy",      location:"Open World", type:"Bounty", level:30, species:"Humanoid"});
npcCollection.push({name:"Clayface",            location:"Open World", type:"Bounty", level:30, species:"Humanoid"});
npcCollection.push({name:"Minotaur",            location:"Open World", type:"Bounty", level:30, species:"Humanoid"});
npcCollection.push({name:"Hawkgirl",            location:"Open World", type:"Bounty", level:30, species:"Humanoid"});
npcCollection.push({name:"Hawkman",             location:"Open World", type:"Bounty", level:30, species:"Humanoid"});
npcCollection.push({name:"Enchanted Statue",    location:"Open World", type:"Bounty", level:30, species:"Humanoid"});
npcCollection.push({name:"Nepheritos",          location:"Open World", type:"Bounty", level:30, species:"Undead"});
npcCollection.push({name:"Avatar of Sin",       location:"Open World", type:"Bounty", level:30, species:"Demon"});
npcCollection.push({name:"Black Canary",        location:"Open World", type:"Bounty", level:30, species:"Humanoid"});
npcCollection.push({name:"Zoom",                location:"Open World", type:"Bounty", level:30, species:"Humanoid"});
npcCollection.push({name:"Professor Zoom",      location:"Open World", type:"Bounty", level:30, species:"Humanoid"});
npcCollection.push({name:"Flash",               location:"Open World", type:"Bounty", level:30, species:"Humanoid"});
npcCollection.push({name:"Black Lightning",     location:"Open World", type:"Bounty", level:30, species:"Humanoid"});
npcCollection.push({name:"Weather Wizard",      location:"Open World", type:"Bounty", level:30, species:"Humanoid"});
npcCollection.push({name:"Captain Cold",        location:"Open World", type:"Bounty", level:30, species:"Humanoid"});
npcCollection.push({name:"The Top",             location:"Open World", type:"Bounty", level:30, species:"Humanoid"});
npcCollection.push({name:"Trickster",           location:"Open World", type:"Bounty", level:30, species:"Humanoid"});
npcCollection.push({name:"JLA Action Figure",   location:"Open World", type:"Bounty", level:30, species:"Humanoid"});
npcCollection.push({name:"Captain Boomerang",   location:"Open World", type:"Bounty", level:30, species:"Humanoid"});
npcCollection.push({name:"Static",              location:"Open World", type:"Bounty", level:30, species:"Humanoid"});
npcCollection.push({name:"Wonder Girl",         location:"Open World", type:"Bounty", level:30, species:"Humanoid"});
npcCollection.push({name:"Kid Flash",           location:"Open World", type:"Bounty", level:30, species:"Humanoid"});
npcCollection.push({name:"General Kordax",      location:"Open World", type:"Bounty", level:30, species:"Humanoid"});
npcCollection.push({name:"Killer Frost",        location:"Open World", type:"Bounty", level:30, species:"Humanoid"});
npcCollection.push({name:"The Judge",           location:"Open World", type:"Bounty", level:30, species:"Humanoid"});


function isNPC(characterName) {

  for (var i=0; i<npcCollection.length; i++) {
    if (characterName == npcCollection[i].name) {
      return true;
    }
  }

  if ((characterName == "Watcher") ||
      (characterName == "Lex Luthor") ||
      (characterName == "Poisoner") ||
      (characterName == "Defense Turret") ||
      (characterName == "Harvester") ||
      (characterName == "Collector") ||
      (characterName == "Coldcut") ||
      (characterName == "Thug") ||
      (characterName == "Morrowbot E1") ||
      (characterName == "Gorilla Bruiser") ||
      (characterName == "Gorilla Prisoner") ||
      (characterName == "Brainiac Encoder") ||
      (characterName == "Brainiac Drone") ||
      (characterName == "Scary Jack") ||
      (characterName == "Porter") ||
      (characterName == "Integrator") ||
      (characterName == "Flare") ||
      (characterName == "Killer Croc Hallucination") ||
      (characterName == "Nightwing Hallucination") ||
      (characterName == "Robin Hallucination") ||
      (characterName == "Elite Adherent") ||
      (characterName == "Prime Harvester") ||
      (characterName == "Brainiac Herald") ||
      (characterName == "Negator") ||
      (characterName == "Neuroseeker") ||
      (characterName == "Screamer") ||
      (characterName == "Tormentor") ||
      (characterName == "Enforcer") ||
      (characterName == "Worker") ||
      (characterName == "Citizen") ||
      (characterName == "Sentry Turret") ||
      (characterName == "The Joker") ||
      (characterName == "Health Pack") ||
      (characterName == "Soulless Fiend") ||
      (characterName == "Soulless Blackguard") ||
      (characterName == "Soulless Tormenter") ||
      (characterName == "Construct") ||
      (characterName == "Recruit") ||
      (characterName == "Archmagent") ||
      (characterName == "Reconstructor") ||
      (characterName == "Incorporator") ||
      (characterName == "Grodd") ||
      (characterName == "Brainiac Annihilator") ||
      (characterName == "Brainiac Spark MK-III") ||
      (characterName == "Security Enforcer") ||
      (characterName == "Special Tasks Guard") ||
      (characterName == "Serrated Guard") ||
      (characterName == "Bruno Mannheim") ||
      (characterName == "Aquaman") ||
      (characterName == "Superman") ||
      (characterName == "Batman") ||
      (characterName == "Red Tornado") ||
      (characterName == "Burrower Egg") ||
      (characterName == "Brainiac Spark MK-II") ||
      (characterName == "Beastiamorph") ||
      (characterName == "Steel") ||
      (characterName == "Relay") ||
      (characterName == "Paradox Reaper Infiltrator") ||
      (characterName == "Paradox Reaper Summoner") ||
      (characterName == "Paradox Reaper Prime") ||
      (characterName == "Paradox Reaper Guardian") ||
      (characterName == "Robot Sidekick")) {
    return true;
  }
  return false;
}


var powerCollection = [];

powerCollection.push({name:"Taser Pull",            type:"Gadgets",role:"Controller"});
powerCollection.push({name:"Fear Gas",              type:"Gadgets",role:"Controller"});
powerCollection.push({name:"Defibrillator",         type:"Gadgets",role:"Controller"});
powerCollection.push({name:"Bunker Buster",         type:"Gadgets",role:"Controller"});
powerCollection.push({name:"Gauss Grenade",         type:"Gadgets",role:"Controller"});
powerCollection.push({name:"Cryo-Foam",             type:"Gadgets",role:"Controller"});
powerCollection.push({name:"Neural Neutralizer",    type:"Gadgets",role:"Controller"});
powerCollection.push({name:"Sleep Dart",            type:"Gadgets",role:"Controller"});
powerCollection.push({name:"Cryo-field",            type:"Gadgets",role:"Controller"});
powerCollection.push({name:"Sticky Bomb",           type:"Gadgets",role:"Controller"});
powerCollection.push({name:"Intimidation",          type:"Gadgets",role:"Controller"});
powerCollection.push({name:"Asphyxiation Gas",      type:"Gadgets",role:"Controller"});
powerCollection.push({name:"Gag Glove",             type:"Gadgets",role:"Controller"});
powerCollection.push({name:"Stasis Field",          type:"Gadgets",role:"Controller"});
powerCollection.push({name:"Boxing",                type:"Hard Light",role:"Controller"});
powerCollection.push({name:"Hand Clap",             type:"Hard Light",role:"Controller"});
powerCollection.push({name:"Impact",                type:"Hard Light",role:"Controller"});
powerCollection.push({name:"Recharge",              type:"Hard Light",role:"Controller"});
powerCollection.push({name:"Entrap",                type:"Hard Light",role:"Controller"});
powerCollection.push({name:"Grasping Hand",         type:"Hard Light",role:"Controller"});
powerCollection.push({name:"Light Blast",           type:"Hard Light",role:"Controller"});
powerCollection.push({name:"Light Claws",           type:"Hard Light",role:"Controller"});
powerCollection.push({name:"Minigun",               type:"Hard Light",role:"Controller"});
powerCollection.push({name:"Spikequake",            type:"Hard Light",role:"Controller"});
powerCollection.push({name:"Ram",                   type:"Hard Light",role:"Controller"});
powerCollection.push({name:"Ballistic Assault",     type:"Hard Light",role:"Controller"});
powerCollection.push({name:"Light Weight",          type:"Hard Light",role:"Controller"});
powerCollection.push({name:"Strafing Run",          type:"Hard Light",role:"Controller"});
powerCollection.push({name:"Chompers",              type:"Hard Light",role:"Controller"});
powerCollection.push({name:"Whip Thrash",           type:"Hard Light",role:"Controller"});
powerCollection.push({name:"Fan",                   type:"Hard Light",role:"Controller"});
powerCollection.push({name:"Chainsaw",              type:"Hard Light",role:"Controller"});
powerCollection.push({name:"Snap Trap",             type:"Hard Light",role:"Controller"});
powerCollection.push({name:"Telekinesis",           type:"Mental",role:"Controller"});
powerCollection.push({name:"Psychic Resonance",     type:"Mental",role:"Controller"});
powerCollection.push({name:"Telekinetic Push",      type:"Mental",role:"Controller"});
powerCollection.push({name:"Psychic Empowerment",   type:"Mental",role:"Controller"});
powerCollection.push({name:"Bolt Barrage",          type:"Mental",role:"Controller"});
powerCollection.push({name:"Psychic Blades",        type:"Mental",role:"Controller"});
powerCollection.push({name:"Telekinetic Bolt",      type:"Mental",role:"Controller"});
powerCollection.push({name:"Pyrokinesis",           type:"Mental",role:"Controller"});
powerCollection.push({name:"Thought Bubble",        type:"Mental",role:"Controller"});
powerCollection.push({name:"Cryokinesis",           type:"Mental",role:"Controller"});
powerCollection.push({name:"Electrogenesis",        type:"Electric",role:"Healer"});
powerCollection.push({name:"Galvanize",             type:"Electric",role:"Healer"});
powerCollection.push({name:"Electroburst",          type:"Electric",role:"Healer"});
powerCollection.push({name:"Bio-Capacitor",         type:"Electric",role:"Healer"});
powerCollection.push({name:"Bioelectric Surge",     type:"Electric",role:"Healer"});
powerCollection.push({name:"Invigorate",            type:"Electric",role:"Healer"});
powerCollection.push({name:"Ionic Drain",           type:"Electric",role:"Healer"});
powerCollection.push({name:"Voltaic Bolt",          type:"Electric",role:"Healer"});
powerCollection.push({name:"Arc Lightning",         type:"Electric",role:"Healer"});
powerCollection.push({name:"Wired",                 type:"Electric",role:"Healer"});
powerCollection.push({name:"Soul Well",             type:"Sorcery",role:"Healer"});
powerCollection.push({name:"Wrath",                 type:"Sorcery",role:"Healer"});
powerCollection.push({name:"Soul Storm",            type:"Sorcery",role:"Healer"});
powerCollection.push({name:"Circle of Protection",  type:"Sorcery",role:"Healer"});
powerCollection.push({name:"Transcendence",         type:"Sorcery",role:"Healer"});
powerCollection.push({name:"Condemn",               type:"Sorcery",role:"Healer"});
powerCollection.push({name:"Rejuvenate",            type:"Sorcery",role:"Healer"});
powerCollection.push({name:"Shared Fate",           type:"Sorcery",role:"Healer"});
powerCollection.push({name:"Vengeance",             type:"Sorcery",role:"Healer"});
powerCollection.push({name:"Karmic Backlash",       type:"Sorcery",role:"Healer"});
powerCollection.push({name:"Invocation of Renewal", type:"Sorcery",role:"Healer"});
powerCollection.push({name:"Final Ruin",            type:"Sorcery",role:"Healer"});
powerCollection.push({name:"Savage Growth",         type:"Nature",role:"Healer"});
powerCollection.push({name:"Roar",                  type:"Nature",role:"Healer"});
powerCollection.push({name:"Rampage",               type:"Nature",role:"Healer"});
powerCollection.push({name:"Vine Lash",             type:"Nature",role:"Healer"});
powerCollection.push({name:"Briar",                 type:"Nature",role:"Healer"});
powerCollection.push({name:"Chaotic Growth",        type:"Nature",role:"Healer"});
powerCollection.push({name:"Harvest",               type:"Nature",role:"Healer"});
powerCollection.push({name:"Metabolism",            type:"Nature",role:"Healer"});
powerCollection.push({name:"Blossom",               type:"Nature",role:"Healer"});
powerCollection.push({name:"Bloom",                 type:"Nature",role:"Healer"});
powerCollection.push({name:"Cross Pollination",     type:"Nature",role:"Healer"});
powerCollection.push({name:"Regeneration",          type:"Nature",role:"Healer"});
powerCollection.push({name:"Impaling Thorns",       type:"Nature",role:"Healer"});
powerCollection.push({name:"Cold Snap",             type:"Ice",role:"Tank"});
powerCollection.push({name:"Snow Ball",             type:"Ice",role:"Tank"});
powerCollection.push({name:"Frost Snipe",           type:"Ice",role:"Tank"});
powerCollection.push({name:"Ice Bash",              type:"Ice",role:"Tank"});
powerCollection.push({name:"Freeze Ray",            type:"Ice",role:"Tank"});
powerCollection.push({name:"Frost Blast",           type:"Ice",role:"Tank"});
powerCollection.push({name:"Reflection",            type:"Ice",role:"Tank"});
powerCollection.push({name:"Ice Boulder",           type:"Ice",role:"Tank"});
powerCollection.push({name:"Impaling Ice",          type:"Ice",role:"Tank"});
powerCollection.push({name:"Winter Ward",           type:"Ice",role:"Tank"});
powerCollection.push({name:"Inescapable Storm",     type:"Ice",role:"Tank"});
powerCollection.push({name:"Glacier Flash",         type:"Ice",role:"Tank"});
powerCollection.push({name:"Arctic Gust",           type:"Ice",role:"Tank"});
powerCollection.push({name:"Bitter Winds",          type:"Ice",role:"Tank"});
powerCollection.push({name:"Blizzard",              type:"Ice",role:"Tank"});
powerCollection.push({name:"Wintry Tempest",        type:"Ice",role:"Tank"});
powerCollection.push({name:"Shatter Restraints",    type:"Ice",role:"Tank"});
powerCollection.push({name:"Resonating Gale",       type:"Ice",role:"Tank"});
powerCollection.push({name:"Immolation",            type:"Fire",role:"Tank"});
powerCollection.push({name:"Enflame",               type:"Fire",role:"Tank"});
powerCollection.push({name:"Flashpoint",            type:"Fire",role:"Tank"});
powerCollection.push({name:"Meteor Strike",         type:"Fire",role:"Tank"});
powerCollection.push({name:"Volcanic Calamity",     type:"Fire",role:"Tank"});
powerCollection.push({name:"Reignition",            type:"Fire",role:"Tank"});
powerCollection.push({name:"Burnout",               type:"Fire",role:"Tank"});
powerCollection.push({name:"Fiery Weapon",          type:"Fire",role:"Tank"});
powerCollection.push({name:"Consume Objects",       type:"Fire",role:"Tank"});
powerCollection.push({name:"Spontaneous Combustion",type:"Fire",role:"Tank"});
powerCollection.push({name:"Inferno",               type:"Fire",role:"Tank"});
powerCollection.push({name:"Stoke Flames",          type:"Fire",role:"Tank"});
powerCollection.push({name:"Jackhammer",            type:"Earth",role:"Tank"});
powerCollection.push({name:"Striking Stones",       type:"Earth",role:"Tank"});
powerCollection.push({name:"Debris Field",          type:"Earth",role:"Tank"});
powerCollection.push({name:"Reinforce",             type:"Earth",role:"Tank"});
powerCollection.push({name:"Tectonic Break",        type:"Earth",role:"Tank"});
powerCollection.push({name:"Sandblast",             type:"Earth",role:"Tank"});
powerCollection.push({name:"Upheaval",              type:"Earth",role:"Tank"});
powerCollection.push({name:"Localised Tremor",      type:"Earth",role:"Tank"});
powerCollection.push({name:"Unstoppable",           type:"Earth",role:"Tank"});

function determineRoleFromPowers(actionStr) {

  var lineIndex = 13;
  var roleObject = {}
  roleObject.role = "unknown";
  roleObject.powerset = "DPS";

  for (var i=0; i<powerCollection.length; i++) {
    if (actionStr.indexOf(powerCollection[i].name) >= lineIndex) {
      roleObject.role = powerCollection[i].role;
      roleObject.powerset = powerCollection[i].type;
      return roleObject;
    }
  }
  return roleObject;
}


// Removes duplicate objects in an array of objects which has properties of item and time

function removeDuplicates(inputArray)
{
var arr = {};

for ( var i=0; i < inputArray.length; i++ ) {
    var keyID1 = inputArray[i]['time'];
    var keyID2 = inputArray[i]['item'];
    var keyID = keyID1 + keyID2;
    arr[keyID] = inputArray[i];
}

var things = new Array();
for ( var key in arr )
    things.push(arr[key]);

return things;
}


function mergeObj(obj1, obj2)
{
  var newObj = {};

  var roles = Object.keys(obj1);
  roles.forEach(function(entry) {
    newObj[entry] = obj1[entry];
  });

  var roles = Object.keys(obj2);
  roles.forEach(function(entry) {
    if (typeof(newObj[entry]) == "undefined") {
      newObj[entry] = obj2[entry];
    }
    else {
      if (entry == "time") {
        if (newObj[entry] <  obj2[entry]) {
          newObj[entry] = obj2[entry];
        }
      }
      else {
        newObj[entry] += parseFloat(obj2[entry]);
      }
    }
  });

  return newObj;
}

// Eliminates duplicate strings in an array of strings
function eliminateDuplicates(arr) {
  var i,
      len=arr.length,
      out=[],
      obj={};

  for (i=0;i<len;i++) {
    obj[arr[i]]=0;
  }
  for (i in obj) {
    out.push(i);
  }
  return out;
}



function concatenateData(stringJSON) {

  var tempObj = {};
  tempObj = JSON.parse(stringJSON);

  var people = Object.keys(tempObj);
    people.forEach(function(person) {
      if (typeof(allLogLinesJSON[person]) == "undefined") {
        allLogLinesJSON[person] = tempObj[person];
      }
      else {
        var itemtypes = Object.keys(tempObj[person]);
        itemtypes.forEach(function(itype) {
          if (typeof(allLogLinesJSON[person][itype]) == "undefined") {
            allLogLinesJSON[person][itype] = tempObj[person][itype];
          }
          else {
            var origArray = allLogLinesJSON[person][itype];
            if (itype == "Roles") {
              allLogLinesJSON[person][itype] = mergeObj(origArray, tempObj[person][itype]);
            }
            else if (itype == "Instance") {
              allLogLinesJSON[person][itype] = eliminateDuplicates(allLogLinesJSON[person][itype].concat(tempObj[person][itype]));
            }
            else if (itype == "VaultTrips") {
              allLogLinesJSON[person][itype] = eliminateDuplicates(allLogLinesJSON[person][itype].concat(tempObj[person][itype]));
            }
            else {
              allLogLinesJSON[person][itype] = removeDuplicates(origArray.concat(tempObj[person][itype]));
            }
          }
        });
      }
    });
}


function saveData(str) {

  var timestamp="";
  var itemType = "";
  var characterName = "";
  var itemName = "";
  var startOfActionString = "";
  var endOfActionString = "";
  var startOfFinalString = "";

/*
  // Experimental way of parsing log lines, needs a lot of work.
  var tempTest = 0;
  if (tempTest == 1) {

    var actionCollection = [];
    var lineIndex = 13;
    var actionIndex = 0;
    var endOfNameIndex = 0;

    actionCollection.push({name:"gained",             item:"Cash"});
    actionCollection.push({name:"received",           item:"Exobit"});
    actionCollection.push({name:"healed",             item:"Role"});
    actionCollection.push({name:"critically healed",  item:"Role"});
    actionCollection.push({name:"damaged",            item:"Attack"});
    actionCollection.push({name:"critically damaged", item:"Attack"});
    actionCollection.push({name:"knocked out",        item:"Attack"});
    actionCollection.push({name:"completed a feat:",  item:"Feat"});

    timestamp=str.slice(0,10);
    for (var i=0; i<actionCollection.length; i++) {
      if (str.indexOf(" " + actionCollection[i].name + " ") >= lineIndex) {
        endOfNameIndex = str.indexOf(actionCollection[i].name);
        if (actionCollection[i].name == "damaged") {
          if (str.indexOf("full auto") >= lineIndex) {
            endOfNameIndex = str.indexOf("full auto");
          }
        }
        else if (actionCollection[i].name == "healed") {
          if (str.indexOf("recovery") >= lineIndex) {
            endOfNameIndex = str.indexOf("recovery");
          }
        }
        actionIndex = i;
        break;
      }
    }
    var characterName=str.slice(12, endOfNameIndex -1).toLowerCase();
    var item=str.slice(endOfNameIndex +actionCollection[actionIndex].name.length+1);
    console.log("ts=" + timestamp + " user=" + characterName + " action=" + actionCollection[actionIndex].name + " item=" + item);
  }

*/

  // Obtain timestamp the item was received
  // Timestamp will always be 10 characters in length and begin the log line
  timestamp=str.slice(0,10);

  // Because of the way I read in the file in chunks, I might end up with chopped up
  //    beginning and ending log lines.  If so, the timestamp is probably broke.
  //    throw away this data!  ugh
  if (str.indexOf("\r") < 0) { console.log("1 throwing away: " + str); return; }
  var currentDay = convertTimestampToDateString(timestamp);
  // Due to the way I read in files, some lines are truncated badly, throw away
  if (currentDay == "NaN/NaN/NaN") { console.log("2 throwing away: " + str); return; }

  // Deduce the type of item based upon keywords in combat log line
  //   Start with the most common
  //   Common counts:
  //     damagelines:     411136
  //     rolelines:       250184
  //     knockedoutlines:  14341
  //     cashlines:        13174
  //     receivedlines:     8124
  //     exolines:          5269
  //     marklines:         2361
  //     featlines:          504
  //     marklines2:          54
  //     exolines2:           25

  if (str.indexOf(" damaged ") > 13) {

      if (str.indexOf(" critically damaged ") > 13) {
        itemType = "CritDamage";
        startOfActionString = str.indexOf(" critically damaged ");
      }
      else {
        itemType = "Damage";
        startOfActionString = str.indexOf(" damaged ");
      }
      var tempcharacterName=str.slice(12, startOfActionString);
      var endOfCharName=tempcharacterName.indexOf("'s ");
      if (endOfCharName < 1) {
        // Add one because the "s" belongs at the end of the character's name
        var endOfCharName=tempcharacterName.indexOf("s' ") + 1;
      }
      if (endOfCharName > 1) {
        characterName=tempcharacterName.slice(0, endOfCharName);
      }
      else {
        // Can't find char name; skip
        return;
      }

      // Don't save data for non-player characters
      if (isNPC(characterName)) {
        return;
      }

      characterName=characterName.toLowerCase();

      var roleObject = determineRoleFromPowers(str);

        if (typeof(allLogLinesJSON_before[characterName]) == "undefined") {
          allLogLinesJSON_before[characterName] = {};
          allLogLinesJSON_before[characterName]["Roles"] = {};
        }
        else {
          if (!allLogLinesJSON_before[characterName].hasOwnProperty("Roles")) {
            allLogLinesJSON_before[characterName]["Roles"] = {};
          }
        }

        if (typeof(allLogLinesJSON_before[characterName]["Roles"][roleObject.powerset]) == "undefined") {
          allLogLinesJSON_before[characterName]["Roles"][roleObject.powerset] = 0;
        }
        allLogLinesJSON_before[characterName]["Roles"][roleObject.powerset] += 1;
        if (typeof(allLogLinesJSON_before[characterName]["Roles"].time) == "undefined") {
          allLogLinesJSON_before[characterName]["Roles"].time = timestamp;
        }
        else {
          if (timestamp > allLogLinesJSON_before[characterName]["Roles"].time) {
            allLogLinesJSON_before[characterName]["Roles"].time = timestamp;
          }
        }

      var victimStringStart = str.indexOf("damaged") + 8;
      var victimStringEnd = str.indexOf(" for ");
      var victimString = str.slice(victimStringStart, victimStringEnd);
      if (victimString == "Pengbot Maximus") {
        if (typeof(allLogLinesJSON_before[characterName]) != "undefined") {
          if (typeof(allLogLinesJSON_before[characterName]["Instance"]) != "undefined") {
            if (allLogLinesJSON_before[characterName]["Instance"].length > 0) {
              var isFound = 0;
              for (var i = 0; i < allLogLinesJSON_before[characterName]["Instance"].length; i++) {
                if (allLogLinesJSON_before[characterName]["Instance"][i] == currentDay) {
                  isFound = 1;
                  break;
                }
              }
              if (isFound == 0) {
                allLogLinesJSON_before[characterName]["Instance"].push(currentDay);
              }
            }
            else {
              allLogLinesJSON_before[characterName]["Instance"].push(currentDay);
            }
          }
          else {
            allLogLinesJSON_before[characterName]["Instance"] = [];
            allLogLinesJSON_before[characterName]["Instance"].push(currentDay);
          }
        }
        else {
          allLogLinesJSON_before[characterName] = {};
          allLogLinesJSON_before[characterName]["Instance"] = [];
          allLogLinesJSON_before[characterName]["Instance"].push(currentDay);
        }
      }

      var startOfDamageString = str.indexOf(" for ") + 5;
      var endOfDamageString = str.length - 1;
      itemName=str.slice(startOfDamageString, endOfDamageString);
      var damageAmount = parseFloat(itemName);
      if (typeof(allLogLinesJSON_before[characterName]) == "undefined") {
        allLogLinesJSON_before[characterName] = {};
      }
      if (typeof(allLogLinesJSON_before[characterName][itemType]) == "undefined") {
        allLogLinesJSON_before[characterName][itemType] = [];
      }
/*
      var save_powers = 0;
      if (save_powers > 0) {
      // Try and save data for each power type but probably too much to store and compute
      var power = "";
      var heading = "DamagePowers";

      if ((index = str.indexOf("Bunker Buster")) > 13) {
        power = "Bunker Buster";
        if (typeof(allLogLinesJSON_before[characterName][heading]) == "undefined") {
          allLogLinesJSON_before[characterName][heading] = {};
        }
        if (typeof(allLogLinesJSON_before[characterName][heading][power]) == "undefined") {
          allLogLinesJSON_before[characterName][heading][power] = [];
        }
        allLogLinesJSON_before[characterName][heading][power].push({time:timestamp, damage:damageAmount});
      }
      else if ((index = str.indexOf("Gauss Grenade")) > 13) {
        power = "Gauss Grenade";
        if (typeof(allLogLinesJSON_before[characterName][heading]) == "undefined") {
          allLogLinesJSON_before[characterName][heading] = {};
        }
        if (typeof(allLogLinesJSON_before[characterName][heading][power]) == "undefined") {
          allLogLinesJSON_before[characterName][heading][power] = [];
        }
        allLogLinesJSON_before[characterName][heading][power].push({time:timestamp, damage:damageAmount});
      }
      }
*/

      // See if we already have an array element for the current day, if so add damage to it and return
      for (var i = 0; i < allLogLinesJSON_before[characterName][itemType].length; i++) {
        if (allLogLinesJSON_before[characterName][itemType][i].time == currentDay) {
          allLogLinesJSON_before[characterName][itemType][i].item += damageAmount;
          return;
        }
      }

      // If we never found an entry for the current day, add a new one to the array
      allLogLinesJSON_before[characterName][itemType].push({time:currentDay, item:damageAmount});

      return;
  }
  else if (str.indexOf(" healed ") > 13) {

      // Lets skip some methods of healing since they won't tell me the char's role/powers
      if ((str.indexOf("Recovery") > 13) ||
          (str.indexOf("Remedy") > 13) ||
          (str.indexOf("Sparring Target") > 10) ||
          (str.indexOf("Battle Plan") > 13) ||
          (str.indexOf("Speed Drain") > 13) ||
          (str.indexOf("Innate Power") > 13) ||
          (str.indexOf("Heal healed") > 13) ||
          (str.indexOf("Cola") > 13) ||
          (str.indexOf("Channel") > 13) ||
          (str.indexOf("Ranged") > 13) ||
          (str.indexOf("Breakout") > 13) ||
          (str.indexOf("Full Auto") > 13)) {
        return;
      }

      // If the log line has the string "healed", figure out what type of controller or healer it
      //   is that did the healing based upon the power used

      itemType = "Roles";

      var index = str.indexOf(" healed ");

      var tempcharacterName=str.slice(12, index);
      var endOfCharName=tempcharacterName.indexOf("'s ");
      if (endOfCharName < 1) {
        // Add one because the "s" belongs at the end of the character's name
        var endOfCharName=tempcharacterName.indexOf("s' ") + 1;
      }
      if (endOfCharName > 1) {
        characterName=tempcharacterName.slice(0, endOfCharName);
      }
      else {
        // Can't find char name; skip
        return;
      }

      // Don't save data for non-player characters
      if (isNPC(characterName)) {
        return;
      }

      characterName=characterName.toLowerCase();

      var roleObject = determineRoleFromPowers(str);

      if (typeof(allLogLinesJSON_before[characterName]) == "undefined") {
        allLogLinesJSON_before[characterName] = {};
        allLogLinesJSON_before[characterName][itemType] = {};
      }
      else {
        if (!allLogLinesJSON_before[characterName].hasOwnProperty(itemType)) {
          allLogLinesJSON_before[characterName][itemType] = {};
        }
      }

      if (typeof(allLogLinesJSON_before[characterName]["Roles"][roleObject.powerset]) == "undefined") {
        allLogLinesJSON_before[characterName]["Roles"][roleObject.powerset] = 0;
      }
      allLogLinesJSON_before[characterName]["Roles"][roleObject.powerset] += 1;
      if (typeof(allLogLinesJSON_before[characterName][itemType].time) == "undefined") {
        allLogLinesJSON_before[characterName][itemType].time = timestamp;
      }
      else {
        if (timestamp > allLogLinesJSON_before[characterName][itemType].time) {
          allLogLinesJSON_before[characterName][itemType].time = timestamp;
        }
      }
      return;
  }
  else if (str.indexOf(" knocked out ") > 13) {

      itemType = "Knockouts";
      startOfActionString = str.indexOf(" knocked out ");
      characterName=str.slice(12, startOfActionString);
      endOfActionString = startOfActionString + 13;
      startOfFinalString = str.length - 1;
      itemName=str.slice(endOfActionString, startOfFinalString);
      // Don't save data for non-player characters
      if (isNPC(characterName)) {
        return;
      }
      characterName=characterName.toLowerCase();
      if (itemName == "Vault Gift") {
        if (typeof(allLogLinesJSON_before[characterName]) == "undefined") {
          allLogLinesJSON_before[characterName] = {};
          allLogLinesJSON_before[characterName]["VaultTrips"] = [];
        }
        else {
          if (!allLogLinesJSON_before[characterName].hasOwnProperty("VaultTrips")) {
            allLogLinesJSON_before[characterName]["VaultTrips"] = [];
          }
        }
        var currentDayTimestamp = convertDateStringToTimestamp(currentDay);
        var vaultTrips = allLogLinesJSON_before[characterName]["VaultTrips"];
        var found = 0;
        for (var i = 0; i < vaultTrips.length; i++) {
          if (vaultTrips[i] == currentDayTimestamp) {
            found = 1;
            break;
          }
        }
        if (found == 0) {
          vaultTrips.push(currentDayTimestamp);
        }
      }
  }
  else if (str.indexOf(" cash") > 20) {

    itemType = "Cash";

    // Obtain the character's name which received the item
    // Character Name will always start after timestamp, colon, space
    // Character name will end before the "received" or "gained" string

    startOfActionString = str.indexOf(" gained ")
    endOfActionString = startOfActionString + 8;

    characterName=str.slice(12, startOfActionString).toLowerCase();

    startOfFinalString = str.indexOf(" cash");

    if (startOfFinalString == endOfActionString) {
      itemName=str.charAt(startOfFinalString - 1);
    }
    else {
      // The item received is after the string "gained" and before "cash"
      itemName=str.slice(endOfActionString, startOfFinalString);
    }

    var cash = parseFloat(itemName);

    // If cash amount is 0, don't save this
    if ((cash < 1) || isNaN(cash)) {
      return;
    }

    // Lets accumulate the cash entries per day instead of storing many
    //     gained 4 cash at timestamp X entries

    if (typeof(allLogLinesJSON_before[characterName]) != "undefined") {
      if (allLogLinesJSON_before[characterName].hasOwnProperty(itemType)) {
        if (allLogLinesJSON_before[characterName][itemType].length > 0) {
          for (var i = 0; i < allLogLinesJSON_before[characterName][itemType].length; i++) {
            if (allLogLinesJSON_before[characterName][itemType][i].time == currentDay) {
              allLogLinesJSON_before[characterName][itemType][i].item += cash;
              return;
            }
          }
        }
      }
      else {
        allLogLinesJSON_before[characterName][itemType] = [];
      }
    }
    else {
      allLogLinesJSON_before[characterName] = {};
      allLogLinesJSON_before[characterName][itemType] = [];
    }

    var logLineEntryJSON = {};
    logLineEntryJSON.time = currentDay;
    logLineEntryJSON.item = cash;
    allLogLinesJSON_before[characterName][itemType].push(logLineEntryJSON);
    return;
  }
  else if (str.indexOf(" Exobit") > 20) {

      // Have to check Exobit before collection since both contain "received"
      // Ignore if gotten more than one since probably thru email or trade
      if ((str.indexOf(" x ") >= 0)) {
        return;
      }
      itemType = "Exobit";
      startOfActionString = str.indexOf(" received ");
      endOfActionString = startOfActionString + 10;
      characterName=str.slice(12, startOfActionString).toLowerCase();
      startOfFinalString = str.indexOf(" Exobit");
      itemName=str.slice(endOfActionString, startOfFinalString);
  }
  else if (str.indexOf(" x Mark of ") > 21) {

      itemType = "Marks";
      startOfActionString = str.indexOf(" received ");
      endOfActionString = startOfActionString + 10;
      characterName=str.slice(12, startOfActionString).toLowerCase();
      startOfFinalString = str.length - 1;
      itemName=str.slice(endOfActionString, startOfFinalString);
  }
  else if (str.indexOf(" completed a feat:") > 13) {

      itemType = "Feats";
      startOfActionString = str.indexOf(" completed a feat:");
      endOfActionString = startOfActionString + 19;
      characterName=str.slice(12, startOfActionString).toLowerCase();
      // For a feat, the end of line is the end of the feat string
      startOfFinalString = str.length - 1;
      itemName=str.slice(endOfActionString, startOfFinalString);
    }
    else if (str.indexOf(" from completing ") > 13) {

      itemType = "Marks";
      startOfActionString = str.indexOf(" earns ");
      endOfActionString = startOfActionString + 7;
      characterName=str.slice(12, startOfActionString).toLowerCase();
      startOfFinalString = str.indexOf(" from completing");
      itemName=str.slice(endOfActionString, startOfFinalString);
    }
    else if (str.indexOf(" Exobyte") > 20) {

      // Some log lines are just trash or stuff gotten from trade or email
      if ((str.indexOf("Depleted ") >= 0) ||
          (str.indexOf("Useless ") >= 0)  ||
          (str.indexOf("Husk") >= 0)  ||
          (str.indexOf(" x ") >= 0)       ||
          (str.indexOf("Exobyte Data") >= 0) ||
          (str.indexOf("Plans:") >= 0) ||
          (str.indexOf("Vial of ") >= 0)) {
        return;
      }
      itemType = "Exobit";
      startOfActionString = str.indexOf(" received ")
      endOfActionString = startOfActionString + 10;
      characterName=str.slice(12, startOfActionString).toLowerCase();
      startOfFinalString = str.indexOf(" Exobyte");
      itemName=str.slice(endOfActionString, startOfFinalString) + " Exobyte";
    }
    else if (str.indexOf(" received ") > 13) {

      startOfActionString = str.indexOf(" received ");
      endOfActionString = startOfActionString + 10;
      characterName=str.slice(12, startOfActionString).toLowerCase();
      // For a collection, the end of line is the end of the collection string
      startOfFinalString = str.length - 1;
      itemName=str.slice(endOfActionString, startOfFinalString);

      if (isGear(itemName))            { itemType = "Gear"; }
      else if (isWeapon(itemName))     { itemType = "Weapon"; }
      else if (isCollection(itemName)) { itemType = "Collection"; }
      else if (isLockbox(str))    { itemType = "Lockbox"; }
      else if (str.indexOf(" received Plans: ") > 13) {
        itemType = "Plans";
        // Remove the Plans: part of the string before the plan name
        endOfActionString = startOfActionString + 17;
        itemName=str.slice(endOfActionString, startOfFinalString);
      }
      else {
        // We receive all kinds of trash, skip these
        // alert("ERROR: unknown object here: " + str);
        return;
      }
    }
    else if (str.indexOf(" evaded ") > 13) {

      var startOfNameString = str.indexOf(" evaded ");
      var endOfNameString = str.indexOf("'");
      characterName=str.slice(startOfNameString, endOfNameString);

      // Don't save data for non-player characters
      if (isNPC(characterName)) {
        return;
      }

      characterName=characterName.toLowerCase();

      var roleObject = determineRoleFromPowers(str);

        if (typeof(allLogLinesJSON_before[characterName]) == "undefined") {
          allLogLinesJSON_before[characterName] = {};
          allLogLinesJSON_before[characterName]["Roles"] = {};
        }
        else {
          if (!allLogLinesJSON_before[characterName].hasOwnProperty("Roles")) {
            allLogLinesJSON_before[characterName]["Roles"] = {};
          }
        }

        if (typeof(allLogLinesJSON_before[characterName]["Roles"][roleObject.powerset]) == "undefined") {
          allLogLinesJSON_before[characterName]["Roles"][roleObject.powerset] = 0;
        }
        allLogLinesJSON_before[characterName]["Roles"][roleObject.powerset] += 1;
        if (typeof(allLogLinesJSON_before[characterName]["Roles"].time) == "undefined") {
          allLogLinesJSON_before[characterName]["Roles"].time = timestamp;
        }
        else {
          if (timestamp > allLogLinesJSON_before[characterName]["Roles"].time) {
            allLogLinesJSON_before[characterName]["Roles"].time = timestamp;
          }
        }
    }
    else {
      return;
      // This should only happen because of coding error.
      //alert("ERROR: unknown object here: " + str);
    }


  // Construct JSON object of all this data.
  // It will basically look like this:
  //
  // {"ClassicFumbles":{
  //     "Exobit":[{"time":"1335027320","item":"Aggressive"},{"time":"1336031202","item":"Support"}],
  //     "Cash":[{"time":"1335027321","item":"950"},{"time":"1335127320","item":"950"}],
  //     "Collection":[{"time":"1335479614","item":"Class O Targeting System"},{"time":"1335027727","item":"Light Kandorian Shoulders"}],
  //     "Mark":[{"time":"1335027727","item":"1 x Mark of Krypton"}]},
  //  "MysticalCat":{
  //     "Exobit":[{"time":"1336031203","item":"Fortified"}]},
  //  "lost sapphire_DF":{
  //     "Feat":[{"time":"1335480800","item":"Beach Comber"}]}}


  // If we already have any log lines for this user stored, use
  //    the array stored and add to it.  If not, it will use the
  //    brand new array created above.

  if (typeof(allLogLinesJSON_before[characterName]) != "undefined") {
    if (typeof(allLogLinesJSON_before[characterName][itemType]) != "undefined") {
      allLogLinesJSON_before[characterName][itemType].push({time:timestamp, item:itemName});
    }
    else {
      allLogLinesJSON_before[characterName][itemType] = [{time:timestamp, item:itemName}];
    }
  }
  else {
    allLogLinesJSON_before[characterName] = {};
    allLogLinesJSON_before[characterName][itemType] = [{time:timestamp, item:itemName}];
  }
};




var allLogLinesJSON_before = {};   //


function parseLogLinesForKeywords(lineArray)
{
    for (var i = 0; i < lineArray.length; i++) {

      // Every log line should have a timestamp and character name first
      //    so received should appear after at least 13 chars into the line

      if (lineArray[i].indexOf(" damaged ") > 13)                { saveData(lineArray[i]); }
      else if (lineArray[i].indexOf(" healed ") > 13)            { saveData(lineArray[i]); }
      else if (lineArray[i].indexOf(" knocked out ") > 13)       { saveData(lineArray[i]); }
      else if (lineArray[i].indexOf(" gained ") > 13)            { saveData(lineArray[i]); }
      else if (lineArray[i].indexOf(" received ") > 13)          { saveData(lineArray[i]); }
      else if (lineArray[i].indexOf(" completed a feat: ") > 13) { saveData(lineArray[i]); }
      else if (lineArray[i].indexOf(" earns ") > 13)             { saveData(lineArray[i]); }
      else if (lineArray[i].indexOf(" evaded ") > 13)            { saveData(lineArray[i]); }
    }
};



function displaymessage()
{
  if (dataLoaded == true) {

    var logLineJSON = JSON.stringify(allLogLinesJSON);
    console.log("length of json = " + logLineJSON.length);
    if (logLineJSON.length < 10000) {
      console.log(logLineJSON);
    }

    var people = Object.keys(allLogLinesJSON);
    console.log("Number of characters = " + people.length);

/*
    var lineArray = [];
    people.forEach(function(person) {
      console.log("Name:" + person);
    });
*/

    var people = Object.keys(allLogLinesJSON);
    people.forEach(function(person) {
      var itemtypes = Object.keys(allLogLinesJSON[person]);
      itemtypes.forEach(function(itype) {
        lineArray = allLogLinesJSON[person][itype];
        for (var i=0; i<lineArray.length; i++) {
          var items = lineArray[i];
          var lineitems = Object.keys(items);
          lineitems.forEach(function(nn) {
            var value = lineArray[i][nn];
            console.log("Name:" + person + ': itype: ' + itype + ' line: '+ i + " nn: " + nn + " value: " + value);
          });
        }
      });
    });

    console.log("Number of feats = " + featCollection.length);
    console.log("Loaded files = " + loadedFiles);
    console.log("File load time start: " + loadTimeStart);
    console.log("File load time end: " + loadTimeEnd);
    console.log("chunkSize : " + chunkSize);
  }
  else {
     alert('data not finished loading');
  }
/*
  var count = 0;
  var people = Object.keys(allLogLinesJSON);
  people.forEach(function(person) {
    count++;
    console.log(count + ". Name:" + person);
  });
*/

}

//pads left
String.prototype.lpad = function(padString, length) {
	var str = this;
    while (str.length < length)
        str = padString + str;
    return str;
}

//pads right
String.prototype.rpad = function(padString, length) {
	var str = this;
    while (str.length < length)
        str = str + padString;
    return str;
}


function printLine(item, count, totalCount, maxitemlen)
{
  if (count > 0) {
    var line = item.rpad(" ", maxitemlen) + "\t" + count + "\t" + Math.round((count/totalCount) * 100) + "%\r\n";
    return line;
  }
  else {
    return "";
  }
}

function printLineDate(item, date, owner, maxitemlen)
{
  var line = item.rpad(" ", maxitemlen) + "\t" + date + "\t" + owner + "\r\n";
  return line;
}

function printLineTime(owner, date, time, maxitemlen)
{
  var line = owner.rpad(" ", maxitemlen) + "\t" + date + "\t" + time + "\r\n";
  return line;
}

Number.prototype.formatMoney = function(c, d, t){
var n = this, c = isNaN(c = Math.abs(c)) ? 2 : c, d = d == undefined ? "," : d, t = t == undefined ? "." : t, s = n < 0 ? "-" : "", i = parseInt(n = Math.abs(+n || 0).toFixed(c)) + "", j = (j = i.length) > 3 ? j % 3 : 0;
   return s + (j ? i.substr(0, j) + t : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) + (c ? d + Math.abs(n - i).toFixed(c).slice(2) : "");
 };


function printLineCash(date, amount, maxitemlen)
{
  var line = amount.formatMoney(0, '.', ',').lpad(" ", 12) + "\t " + date + "\r\n";
  return line;
}

function drawExobitPieChart(aggressive, support, fortified, superspeed, other) {

  var graph_data = new google.visualization.DataTable();
  graph_data.addColumn('string', 'Exobits');
  graph_data.addColumn('number', 'Count');
  graph_data.addRow(["Aggressive", aggressive]);
  graph_data.addRow(["Support", support]);
  graph_data.addRow(["Fortified", fortified]);
  graph_data.addRow(["Super-Speed", superspeed]);
  graph_data.addRow(["Other", other]);

  var options = {
          title: 'Exobit Distribution',
          'chartArea':{left:15,top:65,width:"100%"}
  };
  var chart = new google.visualization.PieChart(document.getElementById('LeftChartDiv'));
  chart.draw(graph_data, options);
}

function drawRolePieChart(tankNum, controllerNum, healerNum, dpsNUM) {

  var graph_data = new google.visualization.DataTable();
  graph_data.addColumn('string', 'Roles');
  graph_data.addColumn('number', 'Count');
  graph_data.addRow(["Tanks", tankNum]);
  graph_data.addRow(["Controllers", controllerNum]);
  graph_data.addRow(["Healers", healerNum]);
  graph_data.addRow(["DPS", dpsNUM]);

  var options = {
          title: 'Role Distribution',
          'chartArea':{left:15,top:65,width:"100%"}
  };
  var chart = new google.visualization.PieChart(document.getElementById('LeftChartDiv'));
  chart.draw(graph_data, options);
}


function figureOutPowerset(obj) {

  var maxCount = 0;
  var probablePowerset = "";

  var possiblePowersets = Object.keys(obj);

  possiblePowersets.forEach(function(powerset) {
    if ((powerset != "time") && (powerset != "DPS")) {
      if (obj[powerset] > maxCount) {
        maxCount = obj[powerset];
        probablePowerset = powerset;
      }
      // console.log("powerset = " + powerset + " obj[powerset] = " + obj[powerset] + " maxCount = " + maxCount + " probablyepower = " + probablePowerset);
    }
  });
  // We don't have enough information to make a determination.
  if (maxCount < 129) {
    probablePowerset = "";
  }
  return probablePowerset;
}


function calculateRoles(character, startDateString, endDateString)
{

  // Since this subroutine can be called multiple times, clear counters

  var totalRoles = 0
  var totalTanks = 0
  var totalControllers = 0
  var totalHealers = 0
  var totalDPS = 0

  var itype = "Roles";
  var lineMessage = "";
  var maxItemLength = 11;
  var maxCharLength = 22;

  var people = [];

  if (character == "All characters") {
    people = Object.keys(allLogLinesJSON);
  }
  else {
    people = [ character ];
  }

  people.forEach(function(person) {

    if (typeof(allLogLinesJSON[person]) != "undefined") {
      if (allLogLinesJSON[person].hasOwnProperty(itype)) {
        var itemObj = allLogLinesJSON[person][itype];

        var currentDay = convertTimestampToDateString(itemObj.time);
        var powerset = figureOutPowerset(itemObj);
        var role = " ";

        var faction = determineFaction(person);

        switch (powerset) {
          case "Fire":
          case "Ice":
          case "Earth":
                role = "Tank";
                totalTanks += 1;
                break;
          case "Gadgets":
          case "Mental":
          case "Hard Light":
                role = "Controller";
                totalControllers += 1;
                break;
          case "Nature":
          case "Sorcery":
          case "Electric":
                role = "Healer";
                totalHealers += 1;
                break;
          case "DPS":
                totalDPS += 1;
                break;
          default:
            // console.log("Undefined role type: " + role + " person = " + person);
        }
        if (powerset != "") {
          lineMessage += person.rpad(" ", maxCharLength) + "\t" + powerset.rpad(" ", maxItemLength) + "\t" + role.rpad(" ", maxItemLength) + "\t\t" + faction + "\t\t" + currentDay + "\r\n";
        }
      }
    }
  });

  totalRoles = (totalTanks + totalControllers + totalHealers + totalDPS);

  var Message = "";
  Message += "Character:         " + character + "\r\n";
  Message += "Date range:        " + startDateString + " through " + endDateString + "\r\n";
  Message += "Total characters:        " + totalRoles + "\r\n\r\n";
  Message += "Role".rpad(" ", maxItemLength) + "\tCount\tPercentage of Total\r\n";

  if (totalRoles > 0) {
    Message += printLine("Tanks",       totalTanks,       totalRoles, maxItemLength);
    Message += printLine("Controllers", totalControllers, totalRoles, maxItemLength);
    Message += printLine("Healers",     totalHealers,     totalRoles, maxItemLength);
    Message += printLine("DPS's",       totalDPS,         totalRoles, maxItemLength);

  }
  Message += "\r\n" + "Character".rpad(" ", maxCharLength) + "\t" + "Powerset".rpad(" ", maxItemLength) + "\t" + "Role".rpad(" ", maxItemLength) + "\t\tFaction\t\tLast Seen\r\n\r\n";
  Message += lineMessage;

  document.getElementById('StatsDisplay').style.display="block";
  document.getElementById('TableDisplay').style.display="none";
  document.getElementById("StatsDisplay").innerHTML = Message;
  drawRolePieChart(totalTanks, totalControllers, totalHealers, totalDPS);
  document.getElementById('RightChartDiv').innerHTML = "";
}

// ********************************************************************
// *	calculateExobits
// *	Go through the stored data of log lines and count up how
// *	many of each type of exobit there are
// *	    For example: 1336011195: ClassicFumbles received Aggressive Exobit
// ********************************************************************

function calculateExobits(character, startDateString, endDateString)
{
  // Since this subroutine can be called multiple times, clear counters

  var total_exos = 0
  var aggressive_exobits  = 0
  var fortified_exobits   = 0
  var support_exobits     = 0
  var tenacious_exobytes  = 0
  var vengeful_exobytes   = 0
  var durable_exobytes    = 0
  var aggressive_exobytes = 0
  var fortified_exobytes  = 0
  var support_exobytes    = 0
  var superspeed_exobits  = 0

  var itype = "Exobit";
  var typeOfExo = "";
  var timestamp = 0;

  var startTS = convertDateStringToTimestamp(startDateString);
  var endTS = convertDateStringToTimestamp(endDateString);

  var people = [];
  var itemTotalPerDay = {};

  if (character == "All characters") {
    people = Object.keys(allLogLinesJSON);
  }
  else {
    people = [ character ];
  }

  people.forEach(function(person) {

    if (typeof(allLogLinesJSON[person]) != "undefined") {
      if (allLogLinesJSON[person].hasOwnProperty(itype)) {
        var itemArray = allLogLinesJSON[person][itype];

        for (var i=0; i<itemArray.length; i++) {
          timestamp = parseFloat(itemArray[i].time);

          if ((timestamp >= startTS) && (timestamp < endTS)) {
            typeOfExo = itemArray[i].item;

            switch (typeOfExo) {
              case "Aggressive":
                aggressive_exobits += 1;
                break;
              case "Support":
                support_exobits += 1;
                break;
              case "Fortified":
                fortified_exobits += 1;
                break;
              case "Tenacious Exobyte":
                tenacious_exobytes += 1;
                break;
              case "Vengeful Exobyte":
                vengeful_exobytes += 1;
                break;
              case "Durable Exobyte":
                durable_exobytes += 1;
                break;
              case "Super-Speed":
                superspeed_exobits += 1;
                break;
              case "Aggressive Exobyte":
                aggressive_exobytes += 1;
                break;
              case "Support Exobyte":
                support_exobytes += 1;
                break;
              case "Fortified Exobyte":
                fortified_exobytes += 1;
                break;
              default:
                console.log("Undefined exobit type: " + typeOfExo + " person = " + person + " timestamp = " + timestamp);
            }
            var currentDay = convertTimestampToDateString(timestamp);
            if (typeof(itemTotalPerDay[currentDay]) == "undefined") {
              itemTotalPerDay[currentDay] = 1;
            }
            else {
              itemTotalPerDay[currentDay] += 1;
            }
          }
        }
      }
    }
  });

  total_exos = (aggressive_exobits + fortified_exobits + support_exobits + tenacious_exobytes + vengeful_exobytes + durable_exobytes + aggressive_exobytes + fortified_exobytes + support_exobytes + superspeed_exobits);

  var maxItemLength = 21;

  var Message = "";
  Message += "Character:         " + character + "\r\n";
  Message += "Date range:        " + startDateString + " through " + endDateString + "\r\n\r\n";
  Message += "Total exos:        " + total_exos + "\r\n\r\n";
  Message += "Item".rpad(" ", maxItemLength) + "\tCount\tPercentage of Total\r\n\r\n";

  if (total_exos > 0) {
    Message += printLine("Aggressive exobits", aggressive_exobits, total_exos, maxItemLength);
    Message += printLine("Support exobits", support_exobits, total_exos, maxItemLength);
    Message += printLine("Fortified exobits", fortified_exobits, total_exos, maxItemLength);
    Message += printLine("Super-Speed exobits", superspeed_exobits, total_exos, maxItemLength);
    Message += printLine("Tenacious exobytes", tenacious_exobytes, total_exos, maxItemLength);
    Message += printLine("Vengeful exobytes", vengeful_exobytes, total_exos, maxItemLength);
    Message += printLine("Durable exobytes", durable_exobytes, total_exos, maxItemLength);
    Message += printLine("Aggressive exobytes", aggressive_exobytes, total_exos, maxItemLength);
    Message += printLine("Fortified exobytes", fortified_exobytes, total_exos, maxItemLength);
    Message += printLine("Support exobytes", support_exobytes, total_exos, maxItemLength);
  }
  document.getElementById("StatsDisplay").innerHTML = Message;

  if (total_exos > 0) {
    var results = '';
    results = '<table class="exobitTableStyle" ALIGN="center">';
    results += '<tr>';
    results += '<th>Type</th><th>Count</th><th>Percent of Total</th>';
    results += '</tr>';
    results += '<tr>';
    results += '<td>Aggressive exobits</td>';
    results += '<td ALIGN="right">' + aggressive_exobits + '</td>';
    results += '<td ALIGN="right">' + Math.round((aggressive_exobits/total_exos) * 100) + '%</td>';
    results += '</tr>';
    results += '<tr>';
    results += '<td>Support exobits</td>';
    results += '<td ALIGN="right">' + support_exobits + '</td>';
    results += '<td ALIGN="right">' + Math.round((support_exobits/total_exos) * 100) + '%</td>';
    results += '</tr>';
    results += '<tr>';
    results += '<td>Fortified exobits</td>';
    results += '<td ALIGN="right">' + fortified_exobits + '</td>';
    results += '<td ALIGN="right">' + Math.round((fortified_exobits/total_exos) * 100) + '%</td>';
    results += '</tr>';
    results += '<tr>';
    results += '<td>Super-Speed exobits</td>';
    results += '<td ALIGN="right">' + superspeed_exobits + '</td>';
    results += '<td ALIGN="right">' + Math.round((superspeed_exobits/total_exos) * 100) + '%</td>';
    results += '</tr>';
    results += '<tr>';
    results += '<td>Tenacious exobytes</td>';
    results += '<td ALIGN="right">' + tenacious_exobytes + '</td>';
    results += '<td ALIGN="right">' + Math.round((tenacious_exobytes/total_exos) * 100) + '%</td>';
    results += '</tr>';
    results += '<tr>';
    results += '<td>Vengeful exobytes</td>';
    results += '<td ALIGN="right">' + vengeful_exobytes + '</td>';
    results += '<td ALIGN="right">' + Math.round((vengeful_exobytes/total_exos) * 100) + '%</td>';
    results += '</tr>';
    results += '<tr>';
    results += '<td>Durable exobytes</td>';
    results += '<td ALIGN="right">' + durable_exobytes + '</td>';
    results += '<td ALIGN="right">' + Math.round((durable_exobytes/total_exos) * 100) + '%</td>';
    results += '</tr>';
    results += '<tr>';
    results += '<td>Aggressive exobytes</td>';
    results += '<td ALIGN="right">' + aggressive_exobytes + '</td>';
    results += '<td ALIGN="right">' + Math.round((aggressive_exobytes/total_exos) * 100) + '%</td>';
    results += '</tr>';
    results += '<tr>';
    results += '<td>Support exobytes</td>';
    results += '<td ALIGN="right">' + support_exobytes + '</td>';
    results += '<td ALIGN="right">' + Math.round((support_exobytes/total_exos) * 100) + '%</td>';
    results += '</tr>';
    results += '<tr>';
    results += '<td>Fortified exobytes</td>';
    results += '<td ALIGN="right">' + fortified_exobytes + '</td>';
    results += '<td ALIGN="right">' + Math.round((fortified_exobytes/total_exos) * 100) + '%</td>';
    results += '</tr>';
    results += '</table>';
  }

  document.getElementById('StatsDisplay').style.display="none";
  document.getElementById('TableDisplay').style.display="block";

  document.getElementById("TableDisplay").innerHTML = results;

  var other = (tenacious_exobytes + vengeful_exobytes + durable_exobytes + aggressive_exobytes + fortified_exobytes + support_exobytes);
  drawExobitPieChart(aggressive_exobits, support_exobits, fortified_exobits, superspeed_exobits, other);
  drawItemChart(itemTotalPerDay, itype);
}


  var collectionCollection = [];
  collectionCollection.push({name:"Thanagarian Disruptor",category:"Alien Technology",city:"Metropolis",zone:"Tomorrow District"});
  collectionCollection.push({name:"Apokaliptian Disabler",category:"Alien Technology",city:"Metropolis",zone:"Tomorrow District"});
  collectionCollection.push({name:"Kryptonian Disruptor", category:"Alien Technology",city:"Metropolis",zone:"Tomorrow District"});
  collectionCollection.push({name:"Martian Disabler",     category:"Alien Technology",city:"Metropolis",zone:"Tomorrow District"});
  collectionCollection.push({name:"Oan Disabler",         category:"Alien Technology",city:"Metropolis",zone:"Tomorrow District"});
  collectionCollection.push({name:"Apellexian Disruptor", category:"Alien Technology",city:"Metropolis",zone:"Tomorrow District"});
  collectionCollection.push({name:"Cathexian Disabler",   category:"Alien Technology",city:"Metropolis",zone:"Tomorrow District"});
  collectionCollection.push({name:"Rannian Disruptor",    category:"Alien Technology",city:"Metropolis",zone:"Tomorrow District"});
  collectionCollection.push({name:"Meatloaf of Steel Signature Plate",         category:"Bibbo's Burgers Signature Plates",city:"Metropolis",zone:"Suicide Slums"});
  collectionCollection.push({name:"World's Greatest Deep Dish Signature Plate",category:"Bibbo's Burgers Signature Plates",city:"Metropolis",zone:"Suicide Slums"});
  collectionCollection.push({name:"The Amazing Appetizer Signature Plate ",    category:"Bibbo's Burgers Signature Plates",city:"Metropolis",zone:"Suicide Slums"});
  collectionCollection.push({name:"The Scarlet Sandwich Signature Plate",      category:"Bibbo's Burgers Signature Plates",city:"Metropolis",zone:"Suicide Slums"});
  collectionCollection.push({name:"Kingfish of the Sea Signature Plate ",      category:"Bibbo's Burgers Signature Plates",city:"Metropolis",zone:"Suicide Slums"});
  collectionCollection.push({name:"The Emerald Artichoke Signature Plate",     category:"Bibbo's Burgers Signature Plates",city:"Metropolis",zone:"Suicide Slums"});
  collectionCollection.push({name:"Brainiac System Breaker Datamatrix",  category:"Brainiac War",city:"Metropolis",zone:"Chinatown"});
  collectionCollection.push({name:"Brainiac Analyzer Datamatrix",        category:"Brainiac War",city:"Metropolis",zone:"Chinatown"});
  collectionCollection.push({name:"Brainiac Havok Servitor Datamatrix",  category:"Brainiac War",city:"Metropolis",zone:"Chinatown"});
  collectionCollection.push({name:"Brainiac Electrode Datamatrix",       category:"Brainiac War",city:"Metropolis",zone:"Chinatown"});
  collectionCollection.push({name:"Brainiac Accumulator Datamatrix",     category:"Brainiac War",city:"Metropolis",zone:"Chinatown"});
  collectionCollection.push({name:"Brainiac Subjugator Datamatrix",      category:"Brainiac War",city:"Metropolis",zone:"Chinatown"});
  collectionCollection.push({name:"Brainiac Spark Datamatrix",           category:"Brainiac War",city:"Metropolis",zone:"Chinatown"});
  collectionCollection.push({name:"Brainiac Incorporator Datamatrix ",   category:"Brainiac War",city:"Metropolis",zone:"Chinatown"});
  collectionCollection.push({name:"Brainiac Eradicator Drone Datamatrix",category:"Brainiac War",city:"Metropolis",zone:"Chinatown"});
  collectionCollection.push({name:"Brainiac Program Datamatrix",         category:"Brainiac War",city:"Metropolis",zone:"Chinatown"});
  collectionCollection.push({name:"Superman Statue Plaque Rubbing",              category:"Centennial",city:"Metropolis",zone:"Midtown"});
  collectionCollection.push({name:"Booster Gold Memorial Plaque Rubbing",        category:"Centennial",city:"Metropolis",zone:"Midtown"});
  collectionCollection.push({name:"Superboy Statue Plaque Rubbing",              category:"Centennial",city:"Metropolis",zone:"Midtown"});
  collectionCollection.push({name:"Battle of Metropolis Memorial Plaque Rubbing",category:"Centennial",city:"Metropolis",zone:"Midtown"});
  collectionCollection.push({name:"The Vanishing Plaque Rubbing",                category:"Centennial",city:"Metropolis",zone:"Midtown"});
  collectionCollection.push({name:"Rain of the Supermen Plaque Rubbing",         category:"Centennial",city:"Metropolis",zone:"Midtown"});
  collectionCollection.push({name:"Martian Invasion Memorial Plaque Rubbing",    category:"Centennial",city:"Metropolis",zone:"Midtown"});
  collectionCollection.push({name:"A Guide to Centennial Park Under the Stars",    category:"Daily Planet Guides",city:"Metropolis",zone:"Tomorrow District"});
  collectionCollection.push({name:"The Planet's Guide to HeroWatching!",           category:"Daily Planet Guides",city:"Metropolis",zone:"Tomorrow District"});
  collectionCollection.push({name:"LexCorp and Metropolis: A Historic Guide",      category:"Daily Planet Guides",city:"Metropolis",zone:"Tomorrow District"});
  collectionCollection.push({name:"A Guide to Wining and Dining in Little Bohemia",category:"Daily Planet Guides",city:"Metropolis",zone:"Tomorrow District"});
  collectionCollection.push({name:"Silver-Plated LexComm Aerphone",    category:"Gold Quality Boostercomms",city:"Metropolis",zone:"Midtown"});
  collectionCollection.push({name:"Staggberry Phone in Smoky Black",   category:"Gold Quality Boostercomms",city:"Metropolis",zone:"Midtown"});
  collectionCollection.push({name:"WayneTech Faeri Smartphone",         category:"Gold Quality Boostercomms",city:"Metropolis",zone:"Midtown"});
  collectionCollection.push({name:"Thundercloud Touchphone by LexComm",category:"Gold Quality Boostercomms",city:"Metropolis",zone:"Midtown"});
  collectionCollection.push({name:"Macroware Botphone ",               category:"Gold Quality Boostercomms",city:"Metropolis",zone:"Midtown"});
  collectionCollection.push({name:"Green Kryptonite",        category:"Kryptonite Isotopes",city:"Metropolis",zone:"Historic District"});
  collectionCollection.push({name:"Red Kryptonite",          category:"Kryptonite Isotopes",city:"Metropolis",zone:"Historic District"});
  collectionCollection.push({name:"Gold Kryptonite",         category:"Kryptonite Isotopes",city:"Metropolis",zone:"Historic District"});
  collectionCollection.push({name:"Blue Kryptonite",         category:"Kryptonite Isotopes",city:"Metropolis",zone:"Historic District"});
  collectionCollection.push({name:"Black Kryptonite",        category:"Kryptonite Isotopes",city:"Metropolis",zone:"Historic District"});
  collectionCollection.push({name:"White Kryptonite",        category:"Kryptonite Isotopes",city:"Metropolis",zone:"Historic District"});
  collectionCollection.push({name:"Orange Kryptonite",       category:"Kryptonite Isotopes",city:"Metropolis",zone:"Historic District"});
  collectionCollection.push({name:"Phantom Zone Kryptonite", category:"Kryptonite Isotopes",city:"Metropolis",zone:"Historic District"});
  collectionCollection.push({name:"LX-38 Battering Ram Plans",        category:"LexCorp Rapid Assualt Gear",city:"Metropolis",zone:"Downtown"});
  collectionCollection.push({name:"LX-587 PepperBall Plans",          category:"LexCorp Rapid Assualt Gear",city:"Metropolis",zone:"Downtown"});
  collectionCollection.push({name:"LX-156 Tactical Beacon Plans",     category:"LexCorp Rapid Assualt Gear",city:"Metropolis",zone:"Downtown"});
  collectionCollection.push({name:"LX-459 Assault Vambrace Plans",    category:"LexCorp Rapid Assualt Gear",city:"Metropolis",zone:"Downtown"});
  collectionCollection.push({name:"LX-115 Squad Radio Plans",         category:"LexCorp Rapid Assualt Gear",city:"Metropolis",zone:"Downtown"});
  collectionCollection.push({name:"LX-407 Emergency Entry Bar Plans", category:"LexCorp Rapid Assualt Gear",city:"Metropolis",zone:"Downtown"});
  collectionCollection.push({name:"LX-76 Netgun Plans",               category:"LexCorp Rapid Assualt Gear",city:"Metropolis",zone:"Downtown"});
  collectionCollection.push({name:"Bloodseeker Vine",  category:"Mana Twisted Plants",city:"Metropolis",zone:"Chinatown"});
  collectionCollection.push({name:"Blightthorn Bush",  category:"Mana Twisted Plants",city:"Metropolis",zone:"Chinatown"});
  collectionCollection.push({name:"Defiled Rotvine",   category:"Mana Twisted Plants",city:"Metropolis",zone:"Chinatown"});
  collectionCollection.push({name:"Weeping Rosehorror",category:"Mana Twisted Plants",city:"Metropolis",zone:"Chinatown"});
  collectionCollection.push({name:"Horrid Timber",     category:"Mana Twisted Plants",city:"Metropolis",zone:"Chinatown"});
  collectionCollection.push({name:"MPD File: Detective Dan the Terrible Turpin", category:"MDP Science Corps",city:"Metropolis",zone:"Metropolis"});
  collectionCollection.push({name:"MPD File: Captain Maggie Sawyer",             category:"MDP Science Corps",city:"Metropolis",zone:"Metropolis"});
  collectionCollection.push({name:"MPD File: Inspector William Henderson",       category:"MDP Science Corps",city:"Metropolis",zone:"Metropolis"});
  collectionCollection.push({name:"MPD File: Detective Paul Cage",               category:"MDP Science Corps",city:"Metropolis",zone:"Metropolis"});
  collectionCollection.push({name:"MPD File: Detective Sam Phelan",              category:"MDP Science Corps",city:"Metropolis",zone:"Metropolis"});
  collectionCollection.push({name:"MPD File: Detective Matthew Martin",          category:"MDP Science Corps",city:"Metropolis",zone:"Metropolis"});
  collectionCollection.push({name:"LexCorp Trooper Blood Sample", category:"Metahumanity's Vanguard",city:"Metropolis",zone:"Little Bohemia"});
  collectionCollection.push({name:"STAR Labs Blood Sample",       category:"Metahumanity's Vanguard",city:"Metropolis",zone:"Historic"});
  collectionCollection.push({name:"Icer Blood Sample",            category:"Metahumanity's Vanguard",city:"Metropolis",zone:"Little Bohemia"});
  collectionCollection.push({name:"Mandrake Blood Sample",        category:"Metahumanity's Vanguard",city:"Metropolis",zone:"Little Bohemia"});
  collectionCollection.push({name:"MSCU Officer Blood Sample",    category:"Metahumanity's Vanguard",city:"Metropolis",zone:"Little Bohemia"});
  collectionCollection.push({name:"HIVE Stinger Blood Sample",    category:"Metahumanity's Vanguard",city:"Metropolis",zone:"Little Bohemia"});
  collectionCollection.push({name:"Gorilla Soldier Blood Sample", category:"Metahumanity's Vanguard",city:"Metropolis",zone:"Little Bohemia"});
  collectionCollection.push({name:"Metropolis Monarchs Pennant",  category:"Metropolis Fans",city:"Metropolis",zone:"Midtown"});
  collectionCollection.push({name:"Metropolis Meteors Pennant",   category:"Metropolis Fans",city:"Metropolis",zone:"Midtown"});
  collectionCollection.push({name:"Metropolis Sharks Pennant",    category:"Metropolis Fans",city:"Metropolis",zone:"Midtown"});
  collectionCollection.push({name:"Metropolis Metros Pennant",    category:"Metropolis Fans",city:"Metropolis",zone:"Midtown"});
  collectionCollection.push({name:"Metropolis Generals Pennant",  category:"Metropolis Fans",city:"Metropolis",zone:"Midtown"});
  collectionCollection.push({name:"Metropolis Mammoths Pennant",  category:"Metropolis Fans",city:"Metropolis",zone:"Midtown"});
  collectionCollection.push({name:"S.T.A.R. Labs  Matchbook",     category:"Metropolis Matchups",city:"Metropolis",zone:"Metropolis"});
  collectionCollection.push({name:"Stryker's Island  Matchbook",  category:"Metropolis Matchups",city:"Metropolis",zone:"Metropolis"});
  collectionCollection.push({name:"Big Belly Burger  Matchbook",  category:"Metropolis Matchups",city:"Metropolis",zone:"Metropolis"});
  collectionCollection.push({name:"LexCorp Building  Matchbook",  category:"Metropolis Matchups",city:"Metropolis",zone:"Metropolis"});
  collectionCollection.push({name:"Daily Planet  Matchbook",      category:"Metropolis Matchups",city:"Metropolis",zone:"Metropolis"});
  collectionCollection.push({name:"Planet Krypton Matchbook",     category:"Metropolis Matchups",city:"Metropolis",zone:"Metropolis"});
  collectionCollection.push({name:"Cain Theatre Matchbook",       category:"Metropolis Matchups",city:"Metropolis",zone:"Metropolis"});
  collectionCollection.push({name:"Ace o' Clubs Pub Matchbook",   category:"Metropolis Matchups",city:"Metropolis",zone:"Metropolis"});
  collectionCollection.push({name:"Sullivan Lane",    category:"Metropolis Street Signs",city:"Metropolis",zone:"Metropolis"});
  collectionCollection.push({name:"Clinton Street",   category:"Metropolis Street Signs",city:"Metropolis",zone:"Metropolis"});
  collectionCollection.push({name:"Bessolo Boulevard",category:"Metropolis Street Signs",city:"Metropolis",zone:"Metropolis"});
  collectionCollection.push({name:"Topaz Lane",       category:"Metropolis Street Signs",city:"Metropolis",zone:"Metropolis"});
  collectionCollection.push({name:"Collyer Street",   category:"Metropolis Street Signs",city:"Metropolis",zone:"Metropolis"});
  collectionCollection.push({name:"Coates Boulevard", category:"Metropolis Street Signs",city:"Metropolis",zone:"Metropolis"});
  collectionCollection.push({name:"Perry White's EIC Pass",                 category:"News from Around the Planet",city:"Metropolis",zone:"Downtown"});
  collectionCollection.push({name:"Steve Lombard's Metrodome Pass",         category:"News from Around the Planet",city:"Metropolis",zone:"Downtown"});
  collectionCollection.push({name:"Ron Troupe's City Hall Pass",            category:"News from Around the Planet",city:"Metropolis",zone:"Downtown"});
  collectionCollection.push({name:"Cat Grant's Club L'Excellence Pass",     category:"News from Around the Planet",city:"Metropolis",zone:"Downtown"});
  collectionCollection.push({name:"Lana Lang's University Pass",            category:"News from Around the Planet",city:"Metropolis",zone:"Downtown"});
  collectionCollection.push({name:"Jimmy Olsen's Photolab Pass",            category:"News from Around the Planet",city:"Metropolis",zone:"Downtown"});
  collectionCollection.push({name:"Lois Lane's LexCorp Pass (stolen)",      category:"News from Around the Planet",city:"Metropolis",zone:"Downtown"});
  collectionCollection.push({name:"Lois Lane's White House Pass",           category:"News from Around the Planet",city:"Metropolis",zone:"Downtown"});
  collectionCollection.push({name:"Clark Kent's Metropolis City Hall Pass", category:"News from Around the Planet",city:"Metropolis",zone:"Downtown"});
  collectionCollection.push({name:"Clark Kent's STAR Labs Pass",            category:"News from Around the Planet",city:"Metropolis",zone:"Downtown"});
  collectionCollection.push({name:"Tablet of the Accomplished Perfect Physician", category:"Signs of the Great Ten",city:"Metropolis",zone:"Chinatown"});
  collectionCollection.push({name:"Tablet of the August General in Iron",         category:"Signs of the Great Ten",city:"Metropolis",zone:"Chinatown"});
  collectionCollection.push({name:"Tablet of the Celestial Archer",               category:"Signs of the Great Ten",city:"Metropolis",zone:"Chinatown"});
  collectionCollection.push({name:"Tablet of the Ghost Fox Killer",               category:"Signs of the Great Ten",city:"Metropolis",zone:"Chinatown"});
  collectionCollection.push({name:"Tablet of the Immortal Man-in-Darkness",       category:"Signs of the Great Ten",city:"Metropolis",zone:"Chinatown"});
  collectionCollection.push({name:"Tablet of the Mother of Champions",            category:"Signs of the Great Ten",city:"Metropolis",zone:"Chinatown"});
  collectionCollection.push({name:"Tablet of the Seven Deadly Brothers",          category:"Signs of the Great Ten",city:"Metropolis",zone:"Chinatown"});
  collectionCollection.push({name:"Tablet of the Shaolin Robot",                  category:"Signs of the Great Ten",city:"Metropolis",zone:"Chinatown"});
  collectionCollection.push({name:"Tablet of the Socialist Red Guardsman",        category:"Signs of the Great Ten",city:"Metropolis",zone:"Chinatown"});
  collectionCollection.push({name:"Tablet of the Thundermind",                    category:"Signs of the Great Ten",city:"Metropolis",zone:"Chinatown"});
  collectionCollection.push({name:"Magent's Rune",                    category:"Sorcerous Vanguard",city:"Metropolis",zone:"Chinatown"});
  collectionCollection.push({name:"Amazonian Rune",                   category:"Sorcerous Vanguard",city:"Metropolis",zone:"Chinatown"});
  collectionCollection.push({name:"Blood Cultist's Rune",             category:"Sorcerous Vanguard",city:"Metropolis",zone:"Chinatown"});
  collectionCollection.push({name:"Demonic Rune",                     category:"Sorcerous Vanguard",city:"Metropolis",zone:"Chinatown"});
  collectionCollection.push({name:"Atlantean Rune",                   category:"Sorcerous Vanguard",city:"Metropolis",zone:"Chinatown"});
  collectionCollection.push({name:"Beastiamorph Rune",                category:"Sorcerous Vanguard",city:"Metropolis",zone:"Chinatown"});
  collectionCollection.push({name:"Sentinel's Rune",                  category:"Sorcerous Vanguard",city:"Metropolis",zone:"Chinatown"});
  collectionCollection.push({name:"Class O Targeting System",         category:"STAR Prototype Gear",city:"Metropolis",zone:"Tomorrow District"});
  collectionCollection.push({name:"Class B Thruster System",          category:"STAR Prototype Gear",city:"Metropolis",zone:"Tomorrow District"});
  collectionCollection.push({name:"Class A Exoskeletal System",       category:"STAR Prototype Gear",city:"Metropolis",zone:"Tomorrow District"});
  collectionCollection.push({name:"Class F Maneuvering Jet System",   category:"STAR Prototype Gear",city:"Metropolis",zone:"Tomorrow District"});
  collectionCollection.push({name:"Class G Sensor Package",           category:"STAR Prototype Gear",city:"Metropolis",zone:"Tomorrow District"});
  collectionCollection.push({name:"Class K Gyroscopic System",        category:"STAR Prototype Gear",city:"Metropolis",zone:"Tomorrow District"});
  collectionCollection.push({name:"Class M Precision Laser System",   category:"STAR Prototype Gear",city:"Metropolis",zone:"Tomorrow District"});
  collectionCollection.push({name:"Dilustel Housing",                 category:"Steelworks Scraps",city:"Metropolis",zone:"Suicide Slums"});
  collectionCollection.push({name:"Palladium Meshweave",              category:"Steelworks Scraps",city:"Metropolis",zone:"Suicide Slums"});
  collectionCollection.push({name:"Chronometrically Neutral Alloy",   category:"Steelworks Scraps",city:"Metropolis",zone:"Suicide Slums"});
  collectionCollection.push({name:"Holoprojection Matrix",            category:"Steelworks Scraps",city:"Metropolis",zone:"Suicide Slums"});
  collectionCollection.push({name:"Acoustium Casing",                 category:"Steelworks Scraps",city:"Metropolis",zone:"Suicide Slums"});
  collectionCollection.push({name:"Tibanna Power Supply",             category:"Steelworks Scraps",city:"Metropolis",zone:"Suicide Slums"});
  collectionCollection.push({name:"The Demons Are Comin' Mug",        category:"You Are Wrong! Fanservice",city:"Metropolis",zone:"Metropolis"});
  collectionCollection.push({name:"YAW! Mug",                         category:"You Are Wrong! Fanservice",city:"Metropolis",zone:"Metropolis"});
  collectionCollection.push({name:"Above Alien Influence Mug",        category:"You Are Wrong! Fanservice",city:"Metropolis",zone:"Metropolis"});
  collectionCollection.push({name:"Stealin' Ma Soul Mug",             category:"You Are Wrong! Fanservice",city:"Metropolis",zone:"Metropolis"});
  collectionCollection.push({name:"Planet Headline: Earth has a Superman!",        category:"Lois Lane Bylines",city:"Metropolis",zone:"Metropolis"});
  collectionCollection.push({name:"Planet Headline: Luthor Jailed!",               category:"Lois Lane Bylines",city:"Metropolis",zone:"Metropolis"});
  collectionCollection.push({name:"Planet Headline: Who is Supergirl?",            category:"Lois Lane Bylines",city:"Metropolis",zone:"Metropolis"});
  collectionCollection.push({name:"Planet Headline: Captain Marvel vs. Superman!", category:"Lois Lane Bylines",city:"Metropolis",zone:"Metropolis"});
  collectionCollection.push({name:"Planet Headline: The Death of Superman!",       category:"Lois Lane Bylines",city:"Metropolis",zone:"Metropolis"});
  collectionCollection.push({name:"Metropolis Eagles Jersey",        category:"Metropolis University",city:"Metropolis",zone:"Metropolis"});
  collectionCollection.push({name:"Metropolis U Yearbook",           category:"Metropolis University",city:"Metropolis",zone:"Metropolis"});
  collectionCollection.push({name:"Eagle's Nest Student Union Pass", category:"Metropolis University",city:"Metropolis",zone:"Metropolis"});
  collectionCollection.push({name:"Met U Varsity Jacket",            category:"Metropolis University",city:"Metropolis",zone:"Metropolis"});


function isCollectionMetropolis(collectionString)
{
  for (var i=0; i<collectionCollection.length; i++) {
    if (collectionCollection[i].city == "Metropolis") {
      if (collectionString == collectionCollection[i].name) {
        return true;
      }
    }
  }
  return false;
}

  collectionCollection.push({name:"Big Belly Dinner Mint Cookies",     category:"Big Belly BurgerTime",city:"Gotham",zone:"Otisburg"});
  collectionCollection.push({name:"Big Belly Raisin Maven Cookies",    category:"Big Belly BurgerTime",city:"Gotham",zone:"Otisburg"});
  collectionCollection.push({name:"Big Belly HappyTime Meal Cookies",  category:"Big Belly BurgerTime",city:"Gotham",zone:"Otisburg"});
  collectionCollection.push({name:"Big Belly Peanutblaster Cookies",   category:"Big Belly BurgerTime",city:"Gotham",zone:"Otisburg"});
  collectionCollection.push({name:"Choco-brand Big Belly Cookie Bits", category:"Big Belly BurgerTime",city:"Gotham",zone:"Otisburg"});
  collectionCollection.push({name:"Excavation Orders",                 category:"Court Orders",city:"Gotham",zone:"South Gotham"});
  collectionCollection.push({name:"Abduction Mandate",                 category:"Court Orders",city:"Gotham",zone:"South Gotham"});
  collectionCollection.push({name:"Bottle Maintenance Mandate",        category:"Court Orders",city:"Gotham",zone:"South Gotham"});
  collectionCollection.push({name:"Builder Protection Mandate",        category:"Court Orders",city:"Gotham",zone:"South Gotham"});
  collectionCollection.push({name:"Gather Components Orders",          category:"Court Orders",city:"Gotham",zone:"South Gotham"});
  collectionCollection.push({name:"Deployment Orders",                 category:"Court Orders",city:"Gotham",zone:"South Gotham"});
  collectionCollection.push({name:"Sub-Avatar Construction Orders",    category:"Court Orders",city:"Gotham",zone:"South Gotham"});
  collectionCollection.push({name:"Conversion Mandate",                category:"Court Orders",city:"Gotham",zone:"South Gotham"});
  collectionCollection.push({name:"Capture Mandate",                   category:"Court Orders",city:"Gotham",zone:"South Gotham"});
  collectionCollection.push({name:"The Personal Diary of Amadeus Arkham",        category:"Depths of Arkham",city:"Gotham",zone:"Arkham Island"});
  collectionCollection.push({name:"Amadeus Arkham's Patient Journal",            category:"Depths of Arkham",city:"Gotham",zone:"Arkham Island"});
  collectionCollection.push({name:"The Observations Journal of Jeremiah Arkham", category:"Depths of Arkham",city:"Gotham",zone:"Arkham Island"});
  collectionCollection.push({name:"Jeremiah Arkham's Play Manuscript",           category:"Depths of Arkham",city:"Gotham",zone:"Arkham Island"});
  collectionCollection.push({name:"Elizabeth Arkham's Personal Diary",           category:"Depths of Arkham",city:"Gotham",zone:"Arkham Island"});
  collectionCollection.push({name:"GCPD File: Detective Josephine Macdonald",    category:"Gotham Central",city:"Gotham",zone:"East End, Burnley"});
  collectionCollection.push({name:"GCPD File: Officer Jim Corrigan (KIA)",       category:"Gotham Central",city:"Gotham",zone:"East End, Burnley"});
  collectionCollection.push({name:"GCPD File: Lieutenant Ron Probson",           category:"Gotham Central",city:"Gotham",zone:"East End, Burnley"});
  collectionCollection.push({name:"GCPD File: Detective Harvey Bullock",         category:"Gotham Central",city:"Gotham",zone:"East End, Burnley"});
  collectionCollection.push({name:"GCPD File: Comissioner Michael Atkins",       category:"Gotham Central",city:"Gotham",zone:"East End, Burnley"});
  collectionCollection.push({name:"GCPD File: Detective Crispus Allen (KIA)",    category:"Gotham Central",city:"Gotham",zone:"East End, Burnley"});
  collectionCollection.push({name:"GCPD File: Former Detective Renee Montoya",   category:"Gotham Central",city:"Gotham",zone:"East End, Burnley"});
  collectionCollection.push({name:"GCPD File: Detective Romy Chandler",          category:"Gotham Central",city:"Gotham",zone:"East End, Burnley"});
  collectionCollection.push({name:"GCPD File: Detective Marcus Driver",          category:"Gotham Central",city:"Gotham",zone:"East End, Burnley"});
  collectionCollection.push({name:"Gotham Knights Pennant",                      category:"Gotham Fans",city:"Gotham",zone:"Gotham"});
  collectionCollection.push({name:"Gotham Gators Pennant",                       category:"Gotham Fans",city:"Gotham",zone:"Gotham"});
  collectionCollection.push({name:"Gotham Guardsman Pennant",                    category:"Gotham Fans",city:"Gotham",zone:"Gotham"});
  collectionCollection.push({name:"Gotham Blades Pennant",                       category:"Gotham Fans",city:"Gotham",zone:"Gotham"});
  collectionCollection.push({name:"Gotham Razorback Pennant",                    category:"Gotham Fans",city:"Gotham",zone:"Gotham"});
  collectionCollection.push({name:"Gotham Griffins Pennant",                     category:"Gotham Fans",city:"Gotham",zone:"Gotham"});
  collectionCollection.push({name:"Gotham Guardians Pennant",                    category:"Gotham Fans",city:"Gotham",zone:"Gotham"});
  collectionCollection.push({name:"Gotham Goliaths Pennant",                     category:"Gotham Fans",city:"Gotham",zone:"Gotham"});
  collectionCollection.push({name:"Guide to Gotham Dining and Dancing",          category:"Gotham Gazette Guides",city:"Gotham",zone:"Gotham"});
  collectionCollection.push({name:"The Gazette's Guide to Coventry Zoo",         category:"Gotham Gazette Guides",city:"Gotham",zone:"Gotham"});
  collectionCollection.push({name:"Season Guide to the Vauxhall Opera",          category:"Gotham Gazette Guides",city:"Gotham",zone:"Gotham"});
  collectionCollection.push({name:"A Guide to Cathedral Square",                 category:"Gotham Gazette Guides",city:"Gotham",zone:"Gotham"});
  collectionCollection.push({name:"Majestic Theater Ticket Stub",                category:"Gotham Meetups",city:"Gotham",zone:"Gotham"});
  collectionCollection.push({name:"Kane Art Museum Ticket Stub",                 category:"Gotham Meetups",city:"Gotham",zone:"Gotham"});
  collectionCollection.push({name:"Gotham Zoo Ticket Stub",                      category:"Gotham Meetups",city:"Gotham",zone:"Gotham"});
  collectionCollection.push({name:"Arkham Asylum Visitor's Stub",                category:"Gotham Meetups",city:"Gotham",zone:"Gotham"});
  collectionCollection.push({name:"Luigi's Pizza Order Stub",                    category:"Gotham Meetups",city:"Gotham",zone:"Gotham"});
  collectionCollection.push({name:"Planet Krypton-Gotham Stub",                  category:"Gotham Meetups",city:"Gotham",zone:"Gotham"});
  collectionCollection.push({name:"Iceberg Lounge Order Stub",                   category:"Gotham Meetups",city:"Gotham",zone:"Gotham"});
  collectionCollection.push({name:"Amusement Mile Ticket Stub",                  category:"Gotham Meetups",city:"Gotham",zone:"Gotham"});
  collectionCollection.push({name:"Aparo Expressway",                            category:"Gotham Street Signs",city:"Gotham",zone:"East End"});
  collectionCollection.push({name:"Novick Tunnel",                               category:"Gotham Street Signs",city:"Gotham",zone:"East End"});
  collectionCollection.push({name:"Peckinpah Street",                            category:"Gotham Street Signs",city:"Gotham",zone:"East End"});
  collectionCollection.push({name:"Broome Street",                               category:"Gotham Street Signs",city:"Gotham",zone:"East End"});
  collectionCollection.push({name:"Sprang Bridge",                               category:"Gotham Street Signs",city:"Gotham",zone:"East End"});
  collectionCollection.push({name:"Westward Bridge",                             category:"Gotham Street Signs",city:"Gotham",zone:"East End"});
  collectionCollection.push({name:"Park Row",                                    category:"Gotham Street Signs",city:"Gotham",zone:"East End"});
  collectionCollection.push({name:"Saint Street",                                category:"Gotham Street Signs",city:"Gotham",zone:"East End"});
  collectionCollection.push({name:"Gotham Wolves Jersey",                        category:"Gotham University",city:"Gotham",zone:"Gotham"});
  collectionCollection.push({name:"Gotham U Yearbook",                           category:"Gotham University",city:"Gotham",zone:"Gotham"});
  collectionCollection.push({name:"Wolf Den Student Union Pass",                 category:"Gotham University",city:"Gotham",zone:"Gotham"});
  collectionCollection.push({name:"Gotham U Varsity Jacket",                     category:"Gotham University",city:"Gotham",zone:"Gotham"});
  collectionCollection.push({name:"Diamond District Penguin Gang Patch",         category:"No Man's Land",city:"Gotham",zone:"East End"});
  collectionCollection.push({name:"East Side Maskers Gang Patch",                category:"No Man's Land",city:"Gotham",zone:"East End"});
  collectionCollection.push({name:"Tricorner GCPD Gang Patch",                   category:"No Man's Land",city:"Gotham",zone:"East End"});
  collectionCollection.push({name:"North Gotham Demonz Gang Patch",              category:"No Man's Land",city:"Gotham",zone:"East End"});
  collectionCollection.push({name:"Old Gotham Lo Boys Gang Patch",               category:"No Man's Land",city:"Gotham",zone:"East End"});
  collectionCollection.push({name:"City Hall Two-Faced Gang Patch",              category:"No Man's Land",city:"Gotham",zone:"East End"});
  collectionCollection.push({name:"West Side Freeze Gang Patch",                 category:"No Man's Land",city:"Gotham",zone:"East End"});
  collectionCollection.push({name:"Arkham Jokerz Gang Patch",                    category:"No Man's Land",city:"Gotham",zone:"East End"});
  collectionCollection.push({name:"Machinegun Umbrella",                         category:"Penguin Umbrellas",city:"Gotham",zone:"East End, Burnley"});
  collectionCollection.push({name:"Hypnosis Umbrella",                           category:"Penguin Umbrellas",city:"Gotham",zone:"East End, Burnley"});
  collectionCollection.push({name:"Gas Umbrella",                                category:"Penguin Umbrellas",city:"Gotham",zone:"East End, Burnley"});
  collectionCollection.push({name:"Missile Umbrella",                            category:"Penguin Umbrellas",city:"Gotham",zone:"East End, Burnley"});
  collectionCollection.push({name:"Flamethrower Umbrella",                       category:"Penguin Umbrellas",city:"Gotham",zone:"East End, Burnley"});
  collectionCollection.push({name:"Laser Umbrella",                              category:"Penguin Umbrellas",city:"Gotham",zone:"East End, Burnley"});
  collectionCollection.push({name:"Acid Spray Umbrella",                         category:"Penguin Umbrellas",city:"Gotham",zone:"East End, Burnley"});
  collectionCollection.push({name:"Sniper Umbrella",                             category:"Penguin Umbrellas",city:"Gotham",zone:"East End, Burnley"});
  collectionCollection.push({name:"Amazon Attack Plaque Rubbing",                category:"Robinson Remembrance",city:"Gotham",zone:"Robinson Park"});
  collectionCollection.push({name:"War Games Plaque Rubbing",                    category:"Robinson Remembrance",city:"Gotham",zone:"Robinson Park"});
  collectionCollection.push({name:"No Man's Land Plaque Rubbing",                category:"Robinson Remembrance",city:"Gotham",zone:"Robinson Park"});
  collectionCollection.push({name:"Rann-Thanagarian War Plaque Rubbing",         category:"Robinson Remembrance",city:"Gotham",zone:"Robinson Park"});
  collectionCollection.push({name:"Day of Vengeance Plaque Rubbing",             category:"Robinson Remembrance",city:"Gotham",zone:"Robinson Park"});
  collectionCollection.push({name:"Seismogram Data",                             category:"South Gotham Scraps",city:"Gotham",zone:"South Gotham"});
  collectionCollection.push({name:"Natural History Museum Ticket Stub",          category:"South Gotham Scraps",city:"Gotham",zone:"South Gotham"});
  collectionCollection.push({name:"Riverside Hotel Keycard",                     category:"South Gotham Scraps",city:"Gotham",zone:"South Gotham"});
  collectionCollection.push({name:"Discarded Propaganda",                        category:"South Gotham Scraps",city:"Gotham",zone:"South Gotham"});
  collectionCollection.push({name:"Gotham Hospital Visitor's Pass",              category:"South Gotham Scraps",city:"Gotham",zone:"South Gotham"});
  collectionCollection.push({name:"Clock Tower Post Card",                       category:"South Gotham Scraps",city:"Gotham",zone:"South Gotham"});
  collectionCollection.push({name:"Chinese New Year Red Envelope",               category:"South Gotham Scraps",city:"Gotham",zone:"South Gotham"});
  collectionCollection.push({name:"Vicki Vale Press Pass",                       category:"South Gotham Scraps",city:"Gotham",zone:"South Gotham"});
  collectionCollection.push({name:"Major Crimes Unit ID Badge",                  category:"South Gotham Scraps",city:"Gotham",zone:"South Gotham"});
  collectionCollection.push({name:"Map of Gotham City",                          category:"Stagg Stop Maps",city:"Gotham",zone:"Burnley, Otisburg"});
  collectionCollection.push({name:"Map of Metropolis",                           category:"Stagg Stop Maps",city:"Gotham",zone:"Burnley, Otisburg"});
  collectionCollection.push({name:"Map of Fawcett City",                         category:"Stagg Stop Maps",city:"Gotham",zone:"Burnley, Otisburg"});
  collectionCollection.push({name:"Map of Keystone City",                        category:"Stagg Stop Maps",city:"Gotham",zone:"Burnley, Otisburg"});
  collectionCollection.push({name:"Map of Bludhaven",                            category:"Stagg Stop Maps",city:"Gotham",zone:"Burnley, Otisburg"});
  collectionCollection.push({name:"Map of Opal City",                            category:"Stagg Stop Maps",city:"Gotham",zone:"Burnley, Otisburg"});
  collectionCollection.push({name:"Map of Smallville",                           category:"Stagg Stop Maps",city:"Gotham",zone:"Burnley, Otisburg"});
  collectionCollection.push({name:"Map of Star City",                            category:"Stagg Stop Maps",city:"Gotham",zone:"Burnley, Otisburg"});
  collectionCollection.push({name:"Map of Coast City",                           category:"Stagg Stop Maps",city:"Gotham",zone:"Burnley, Otisburg"});
  collectionCollection.push({name:"WayneTech Trooper's Helm Circuitry",          category:"Technology's Vanguard",city:"Gotham",zone:"East End"});
  collectionCollection.push({name:"Fear Gas Fogger Circuitry",                   category:"Technology's Vanguard",city:"Gotham",zone:"East End"});
  collectionCollection.push({name:"Mobster Stealth Circuitry",                   category:"Technology's Vanguard",city:"Gotham",zone:"East End"});
  collectionCollection.push({name:"SCU Mask Circuitry",                          category:"Technology's Vanguard",city:"Gotham",zone:"East End"});
  collectionCollection.push({name:"Venom Distillation Circuitry",                category:"Technology's Vanguard",city:"Gotham",zone:"East End"});
  collectionCollection.push({name:"OMAC Core Circuitry ",                        category:"Technology's Vanguard",city:"Gotham",zone:"East End"});
  collectionCollection.push({name:"Jokerbot Circuitry",                          category:"Technology's Vanguard",city:"Gotham",zone:"East End"});
  collectionCollection.push({name:"Killer King of Hearts",                       category:"The Joker's Trick Cards",city:"Gotham",zone:"East End"});
  collectionCollection.push({name:"TNT Ten of Diamonds",                         category:"The Joker's Trick Cards",city:"Gotham",zone:"East End"});
  collectionCollection.push({name:"Sharpened Seven of Spades ",                  category:"The Joker's Trick Cards",city:"Gotham",zone:"East End"});
  collectionCollection.push({name:"Neurotoxin Nine of Hearts",                   category:"The Joker's Trick Cards",city:"Gotham",zone:"East End"});
  collectionCollection.push({name:"Explosive Eight of Diamonds",                 category:"The Joker's Trick Cards",city:"Gotham",zone:"East End"});
  collectionCollection.push({name:"Gazette Headline: Who is the Batman?",        category:"Vicki Vale Bylines",city:"Gotham",zone:"Otisburg"});
  collectionCollection.push({name:"Gazette Headline: Joker Escapes Arkham!",       category:"Vicki Vale Bylines",city:"Gotham",zone:"Otisburg"});
  collectionCollection.push({name:"Gazette Headline: Fear of Scarecrow Grips City",category:"Vicki Vale Bylines",city:"Gotham",zone:"Otisburg"});
  collectionCollection.push({name:"Gazette Headline: No-Man's Land Ended!",        category:"Vicki Vale Bylines",city:"Gotham",zone:"Otisburg"});
  collectionCollection.push({name:"Gazette Headline: Gordon Named Commisioner!",   category:"Vicki Vale Bylines",city:"Gotham",zone:"Otisburg"});
  collectionCollection.push({name:"Gazette Headline: Catwoman Crime Spree!",       category:"Vicki Vale Bylines",city:"Gotham",zone:"Otisburg"});
  collectionCollection.push({name:"Waynetech Tachymeter Watch",                    category:"WayneTech Watches",city:"Gotham",zone:"Gotham"});
  collectionCollection.push({name:"Stainless Steel WayneTech Watch",               category:"WayneTech Watches",city:"Gotham",zone:"Gotham"});
  collectionCollection.push({name:"Waynetech Chronographite Watch",                category:"WayneTech Watches",city:"Gotham",zone:"Gotham"});
  collectionCollection.push({name:"Waynetech Seamaster Diving Watch",              category:"WayneTech Watches",city:"Gotham",zone:"Gotham"});
  collectionCollection.push({name:"Wayne Enterprises Executive-Class Watch",       category:"WayneTech Watches",city:"Gotham",zone:"Gotham"});


function isCollectionGotham(collectionString)
{
  for (var i=0; i<collectionCollection.length; i++) {
    if (collectionCollection[i].city == "Gotham") {
      if (collectionString == collectionCollection[i].name) {
        return true;
      }
    }
  }
  return false;
}

  collectionCollection.push({name:"Hall of Justice Access Pass",            category:"Watchtower",city:"Watchtower",zone:"Watchtower"});
  collectionCollection.push({name:"Slideways Teleport Beacon",              category:"Watchtower",city:"Watchtower",zone:"Watchtower"});
  collectionCollection.push({name:"Hydroponics Lab Gene Scanner",           category:"Watchtower",city:"Watchtower",zone:"Watchtower"});
  collectionCollection.push({name:"\"Thanagar Invasion\" War Room Program", category:"Watchtower",city:"Watchtower",zone:"Watchtower"});
  collectionCollection.push({name:"Hall of Heroes Statuary Guide",          category:"Watchtower",city:"Watchtower",zone:"Watchtower"});
  collectionCollection.push({name:"Monitor Womb Comms Keycode",             category:"Watchtower",city:"Watchtower",zone:"Watchtower"});
  collectionCollection.push({name:"Docking Bay Hailing Frequency",          category:"Watchtower",city:"Watchtower",zone:"Watchtower"});
  collectionCollection.push({name:"Containment Cells Visitor's Pass",       category:"Watchtower",city:"Watchtower",zone:"Watchtower"});
  collectionCollection.push({name:"\"Pit Fighter\" Combat Bracer",          category:"Hall of Doom",city:"Hall of Doom",zone:"Hall of Doom"});
  collectionCollection.push({name:"C&C Comms Keycode",                      category:"Hall of Doom",city:"Hall of Doom",zone:"Hall of Doom"});
  collectionCollection.push({name:"Biosphere Gene Scanner",                 category:"Hall of Doom",city:"Hall of Doom",zone:"Hall of Doom"});
  collectionCollection.push({name:"Inner Sanctum Access Pass",              category:"Hall of Doom",city:"Hall of Doom",zone:"Hall of Doom"});
  collectionCollection.push({name:"Weapons Lab Protection Field",           category:"Hall of Doom",city:"Hall of Doom",zone:"Hall of Doom"});
  collectionCollection.push({name:"Dungeon Biometric Wristband",            category:"Hall of Doom",city:"Hall of Doom",zone:"Hall of Doom"});
  collectionCollection.push({name:"Armory Ultra-security Key",              category:"Hall of Doom",city:"Hall of Doom",zone:"Hall of Doom"});
  collectionCollection.push({name:"Teleportation Tubes Beacon",             category:"Hall of Doom",city:"Hall of Doom",zone:"Hall of Doom"});
  collectionCollection.push({name:"Weather Balloon Casing",                 category:"Welcome to Groom Lake",city:"Alert",zone:"Area 51"});
  collectionCollection.push({name:"Majestic 12 Brainwashing Schema",        category:"Welcome to Groom Lake",city:"Alert",zone:"Area 51"});
  collectionCollection.push({name:"Aurora-58 Warp Drive Capacitor",         category:"Welcome to Groom Lake",city:"Alert",zone:"Area 51"});
  collectionCollection.push({name:"Unpowered NID Blaster Pistol",           category:"Welcome to Groom Lake",city:"Alert",zone:"Area 51"});
  collectionCollection.push({name:"SDI-Style Thermoptics",                  category:"Welcome to Groom Lake",city:"Alert",zone:"Area 51"});
  collectionCollection.push({name:"Basalt Compounds",                       category:"Volcanic Upheaval",city:"Alert",zone:"Gorilla Island"});
  collectionCollection.push({name:"Komatite Compounds",                     category:"Volcanic Upheaval",city:"Alert",zone:"Gorilla Island"});
  collectionCollection.push({name:"Diorite Compounds",                      category:"Volcanic Upheaval",city:"Alert",zone:"Gorilla Island"});
  collectionCollection.push({name:"Adesite Compounds",                      category:"Volcanic Upheaval",city:"Alert",zone:"Gorilla Island"});
  collectionCollection.push({name:"Rhyolite Compounds",                     category:"Volcanic Upheaval",city:"Alert",zone:"Gorilla Island"});
  collectionCollection.push({name:"Pegmatite Compounds",                    category:"Volcanic Upheaval",city:"Alert",zone:"Gorilla Island"});
  collectionCollection.push({name:"Ununquadium",                            category:"Rarest of Materials",city:"Alert",zone:"Oolong Island"});
  collectionCollection.push({name:"Neodymium",                              category:"Rarest of Materials",city:"Alert",zone:"Oolong Island"});
  collectionCollection.push({name:"Copernicium",                            category:"Rarest of Materials",city:"Alert",zone:"Oolong Island"});
  collectionCollection.push({name:"Promethium",                             category:"Rarest of Materials",city:"Alert",zone:"Oolong Island"});
  collectionCollection.push({name:"Einsteinium",                            category:"Rarest of Materials",city:"Alert",zone:"Oolong Island"});
  collectionCollection.push({name:"Darmstadtium",                           category:"Rarest of Materials",city:"Alert",zone:"Oolong Island"});
  collectionCollection.push({name:"Hassium",                                category:"Rarest of Materials",city:"Alert",zone:"Oolong Island"});
  collectionCollection.push({name:"Rutherfordium",                          category:"Rarest of Materials",city:"Alert",zone:"Oolong Island"});
  collectionCollection.push({name:"Anorthosite",                            category:"Lunar Soil Compounds",city:"Alert",zone:"Hive Moon Base"});
  collectionCollection.push({name:"Pyroxene",                               category:"Lunar Soil Compounds",city:"Alert",zone:"Hive Moon Base"});
  collectionCollection.push({name:"Ilmenite",                               category:"Lunar Soil Compounds",city:"Alert",zone:"Hive Moon Base"});
  collectionCollection.push({name:"Norite",                                 category:"Lunar Soil Compounds",city:"Alert",zone:"Hive Moon Base"});
  collectionCollection.push({name:"Troctolite",                             category:"Lunar Soil Compounds",city:"Alert",zone:"Hive Moon Base"});
  collectionCollection.push({name:"Olivine",                                category:"Lunar Soil Compounds",city:"Alert",zone:"Hive Moon Base"});
  collectionCollection.push({name:"Red Corn",                               category:"Genetically Modified Maize",city:"Alert",zone:"SmallVille"});
  collectionCollection.push({name:"Blue Corn",                              category:"Genetically Modified Maize",city:"Alert",zone:"SmallVille"});
  collectionCollection.push({name:"Yellow Corn",                            category:"Genetically Modified Maize",city:"Alert",zone:"SmallVille"});
  collectionCollection.push({name:"White Corn",                             category:"Genetically Modified Maize",city:"Alert",zone:"SmallVille"});
  collectionCollection.push({name:"Purple Corn",                            category:"Genetically Modified Maize",city:"Alert",zone:"SmallVille"});
  collectionCollection.push({name:"Hydroxylamine NH20H",                    category:"Chemo's Legacy",city:"Alert",zone:"Bludhaven"});
  collectionCollection.push({name:"Alkylating Agents",                      category:"Chemo's Legacy",city:"Alert",zone:"Bludhaven"});
  collectionCollection.push({name:"Oxidative Molecules",                    category:"Chemo's Legacy",city:"Alert",zone:"Bludhaven"});
  collectionCollection.push({name:"Ionizing Materials",                     category:"Chemo's Legacy",city:"Alert",zone:"Bludhaven"});
  collectionCollection.push({name:"DNA Intercalcating Agents",              category:"Chemo's Legacy",city:"Alert",zone:"Bludhaven"});
  collectionCollection.push({name:"DNA Crosslinkers",                       category:"Chemo's Legacy",city:"Alert",zone:"Bludhaven"});
  collectionCollection.push({name:"Doctor Death's Plague Gas",                   category:"Science Squad Experiments",city:"Alert",zone:"Oolong Island"});
  collectionCollection.push({name:"Veronica Cale's Ingestible Containment Unit", category:"Science Squad Experiments",city:"Alert",zone:"Oolong Island"});
  collectionCollection.push({name:"Doctor Sivana's Suspendium",                  category:"Science Squad Experiments",city:"Alert",zone:"Oolong Island"});
  collectionCollection.push({name:"IQ's Jet Boots",                              category:"Science Squad Experiments",city:"Alert",zone:"Oolong Island"});
  collectionCollection.push({name:"Will Magnus'  Particle Wave Ray Gun",         category:"Science Squad Experiments",city:"Alert",zone:"Oolong Island"});
  collectionCollection.push({name:"Red Tyrant Robot Head",                       category:"Science Squad Experiments",city:"Alert",zone:"Oolong Island"});

  collectionCollection.push({name:"Jackal-headed Scepter",                       category:"Ancient Khandaqian Relics",city:"Alert",zone:"Khandaq"});
  collectionCollection.push({name:"Amuletic Knot",                               category:"Ancient Khandaqian Relics",city:"Alert",zone:"Khandaq"});
  collectionCollection.push({name:"Vulture-carved Collar",                       category:"Ancient Khandaqian Relics",city:"Alert",zone:"Khandaq"});
  collectionCollection.push({name:"Falcon-headed ring",                          category:"Ancient Khandaqian Relics",city:"Alert",zone:"Khandaq"});
  collectionCollection.push({name:"Funerary Papyrus",                            category:"Ancient Khandaqian Relics",city:"Alert",zone:"Khandaq"});
  collectionCollection.push({name:"Scarab Diadem",                               category:"Ancient Khandaqian Relics",city:"Alert",zone:"Khandaq"});

  collectionCollection.push({name:"Jitters Coffee Cup",                          category:"Central City Attractions",city:"Central City",zone:"Central City"});
  collectionCollection.push({name:"Central City Stars Pennant",                  category:"Central City Attractions",city:"Central City",zone:"Central City"});
  collectionCollection.push({name:"Flash Museum Ticket",                         category:"Central City Attractions",city:"Central City",zone:"Central City"});
  collectionCollection.push({name:"Van Buren Bridge Postcard",                   category:"Central City Attractions",city:"Central City",zone:"Central City"});

  collectionCollection.push({name:"With these rings we unite our spirits ...",      category:"Spiritual Wedding Vow",city:"Event",zone:"Valentines"});
  collectionCollection.push({name:"we will honor each other's heart and souls ...", category:"Spiritual Wedding Vow",city:"Event",zone:"Valentines"});
  collectionCollection.push({name:"we will protect and support each other ...",     category:"Spiritual Wedding Vow",city:"Event",zone:"Valentines"});
  collectionCollection.push({name:"from this day forward.",                         category:"Spiritual Wedding Vow",city:"Event",zone:"Valentines"});
  collectionCollection.push({name:"I look forward to days of joy ...",              category:"Emotional Wedding Vow",city:"Event",zone:"Valentines"});
  collectionCollection.push({name:"to times of sadness and pain ...",               category:"Emotional Wedding Vow",city:"Event",zone:"Valentines"});
  collectionCollection.push({name:"even to the darkest of times ...",               category:"Emotional Wedding Vow",city:"Event",zone:"Valentines"});
  collectionCollection.push({name:"as long as I can be with you.",                  category:"Emotional Wedding Vow",city:"Event",zone:"Valentines"});
  collectionCollection.push({name:"Though we have changed ...",                     category:"Renewal Wedding Vow",city:"Event",zone:"Valentines"});
  collectionCollection.push({name:"our love stays true ...",                        category:"Renewal Wedding Vow",city:"Event",zone:"Valentines"});
  collectionCollection.push({name:"our love has matured and grown ...",             category:"Renewal Wedding Vow",city:"Event",zone:"Valentines"});
  collectionCollection.push({name:"and our love will hold.",                        category:"Renewal Wedding Vow",city:"Event",zone:"Valentines"});
  collectionCollection.push({name:"With this ring, I thee wed ...",                 category:"Classic Wedding Vow",city:"Event",zone:"Valentines"});
  collectionCollection.push({name:"before these witnesses ...",                     category:"Classic Wedding Vow",city:"Event",zone:"Valentines"});
  collectionCollection.push({name:"to love and honor ...",                          category:"Classic Wedding Vow",city:"Event",zone:"Valentines"});
  collectionCollection.push({name:"all the days of our lives.",                     category:"Classic Wedding Vow",city:"Event",zone:"Valentines"});
  collectionCollection.push({name:"Clover Leaf of Hope",                            category:"Four-Leaf Clover",city:"Event",zone:"St. Patrick's Day"});
  collectionCollection.push({name:"Clover Leaf of Faith",                           category:"Four-Leaf Clover",city:"Event",zone:"St. Patrick's Day"});
  collectionCollection.push({name:"Clover Leaf of Love",                            category:"Four-Leaf Clover",city:"Event",zone:"St. Patrick's Day"});
  collectionCollection.push({name:"Clover Leaf of Luck",                            category:"Four-Leaf Clover",city:"Event",zone:"St. Patrick's Day"});
  collectionCollection.push({name:"Genetically Modified Seed",                      category:"Seeds of Spring",city:"Event",zone:"Gotham"});
  collectionCollection.push({name:"Hybrid Seed",                                    category:"Seeds of Spring",city:"Event",zone:"Gotham"});
  collectionCollection.push({name:"Heirloom Seed",                                  category:"Seeds of Spring",city:"Event",zone:"Gotham"});
  collectionCollection.push({name:"Open Pollinated Seed",                           category:"Seeds of Spring",city:"Event",zone:"Gotham"});
  collectionCollection.push({name:"Dormant Seed",                                   category:"Seeds of Spring",city:"Event",zone:"Gotham"});
  collectionCollection.push({name:"Germinated Seed",                                category:"Seeds of Spring",city:"Event",zone:"Gotham"});
  collectionCollection.push({name:"Naughty List: Two-Face",                         category:"Holiday Naughty List",city:"Event",zone:"Metropolis"});
  collectionCollection.push({name:"Naughty List: Oswald Chesterfield Cobblepot",    category:"Holiday Naughty List",city:"Event",zone:"Metropolis"});
  collectionCollection.push({name:"Naughty List: Thaddeus Bodog Sivana",            category:"Holiday Naughty List",city:"Event",zone:"Metropolis"});
  collectionCollection.push({name:"Naughty List: Lobo... and the Easter Bunny!!!",  category:"Holiday Naughty List",city:"Event",zone:"Metropolis"});
  collectionCollection.push({name:"Naughty List: Lex Luthor",                       category:"Holiday Naughty List",city:"Event",zone:"Metropolis"});
  collectionCollection.push({name:"Naughty List: Noah Kuttler",                     category:"Holiday Naughty List",city:"Event",zone:"Metropolis"});
  collectionCollection.push({name:"Nice List: Harvey Dent",                         category:"Holiday Nice List",city:"Event",zone:"Metropolis"});
  collectionCollection.push({name:"Nice List: Barry Allen",                         category:"Holiday Nice List",city:"Event",zone:"Metropolis"});
  collectionCollection.push({name:"Nice List: Clark Kent",                          category:"Holiday Nice List",city:"Event",zone:"Metropolis"});
  collectionCollection.push({name:"Nice List: Diana Prince",                        category:"Holiday Nice List",city:"Event",zone:"Metropolis"});
  collectionCollection.push({name:"Nice List: Barbara Gordon",                      category:"Holiday Nice List",city:"Event",zone:"Metropolis"});
  collectionCollection.push({name:"Nice List: Billy Batson",                        category:"Holiday Nice List",city:"Event",zone:"Metropolis"});
  collectionCollection.push({name:"Vestige of Trintonis",							category:"Atlantean Artifacts",city:"Event",zone:"Tides of War"});
  collectionCollection.push({name:"Obsidian Age Ornament",							category:"Atlantean Artifacts",city:"Event",zone:"Tides of War"});
  collectionCollection.push({name:"Poseidonis Waystone",							category:"Atlantean Artifacts",city:"Event",zone:"Tides of War"});
  collectionCollection.push({name:"Atlantean Zodiac Coin",							category:"Atlantean Artifacts",city:"Event",zone:"Tides of War"});
  collectionCollection.push({name:"Atlantean Royal Seal",							category:"Atlantean Artifacts",city:"Event",zone:"Tides of War"});
  collectionCollection.push({name:"Ammonite",										category:"Marine Life Fossils",city:"Event",zone:"Tides of War"});
  collectionCollection.push({name:"Murex",											category:"Marine Life Fossils",city:"Event",zone:"Tides of War"});
  collectionCollection.push({name:"Geoduck",										category:"Marine Life Fossils",city:"Event",zone:"Tides of War"});
  collectionCollection.push({name:"Plesiosaur Bone",								category:"Marine Life Fossils",city:"Event",zone:"Tides of War"});
  collectionCollection.push({name:"Giant Pecten",									category:"Marine Life Fossils",city:"Event",zone:"Tides of War"});
  collectionCollection.push({name:"Limpet",											category:"Marine Life Fossils",city:"Event",zone:"Tides of War"});

function isCollectionOther(lineString)
{
  for (var i=0; i<collectionCollection.length; i++) {
    if ((collectionCollection[i].city != "Gotham") && (collectionCollection[i].city != "Metropolis")) {
      if (lineString == collectionCollection[i].name) {
        return true;
      }
    }
  }
  return false;
}

function isCollection(lineString)
{
  if (isCollectionMetropolis(lineString))  { return true; }
  else if (isCollectionGotham(lineString)) { return true; }
  else if (isCollectionOther(lineString))  { return true; }
  else { return false; }
}


function isLockboxConsumable(lineString)
{
  var lockboxArray = [ "Compound ATK-0", "Compound AUX-0" ];

  for (var i=0; i<lockboxArray.length; i++) {
    if (lineString.indexOf(lockboxArray[i]) >= 0) {
      return true;
    }
  }
  return false;
}

function isLockboxNeck(lineString)
{
  var lockboxArray = [ " Pendant of Relief", " Pendant of Accuracy", " Pendant of Panacea", " Pendant of Endurance",
                       " Sautoir of Relief", " Sautoir of Accuracy", " Sautoir of Panacea", " Sautoir of Endurance",
                       " Choker of Relief",  " Choker of Accuracy",  " Choker of Panacea",  " Choker of Endurance" ];

  for (var i=0; i<lockboxArray.length; i++) {
    if (lineString.indexOf(lockboxArray[i]) >= 0) {
      return true;
    }
  }
  return false;
}

function isLockboxRing(lineString)
{
  var lockboxArray = [ " Eternium ", " Vanadium ", " Steel ",
                       " Vanadium Loop", " Vanadium Ring", " Vanadium Band", " Vanadium Claddagh",
                       " Steel Claddagh"," Steel Knucklespike", " Steel Loop", " Steel Ring",
                       " Band of Relief", " Band of Accuracy", " Band of Panacea", " Band of Endurance" ];

  // Special case for now until i do this better
  if ((lineString.indexOf("Steel Cap") >= 0) ||
      (lineString.indexOf("Band of Dormorian Steel") >= 0) ||
      (lineString.indexOf("Band of Dormorian Steel") >= 0) ||
      (lineString.indexOf("Hardened Vanadium Boots") >= 0) ||
      (lineString.indexOf("Neophyte Band of Panacea") >= 0) ||
      (lineString.indexOf("Lightweight Vanadium Boots") >= 0) ||
      (lineString.indexOf("Stainless Steel Waynetech Watch") >= 0)) {
    return false;
  }

  for (var i=0; i<lockboxArray.length; i++) {
    if (lineString.indexOf(lockboxArray[i]) >= 0) {
      return true;
    }
  }
  return false;
}

function isLockboxGear(lineString)
{
  var lockboxArray = [ "Extraordinary ", "Cybernetic Breastplate", "Cybernetic Gauntlets" ];

  for (var i=0; i<lockboxArray.length; i++) {
    if (lineString.indexOf(lockboxArray[i]) >= 0) {
      return true;
    }
  }
  return false;
}

function isLockbox(lineString)
{
  if (isLockboxConsumable(lineString)) { return true; }
  else if (isLockboxNeck(lineString))  { return true; }
  else if (isLockboxRing(lineString))  { return true; }
  else if (isLockboxGear(lineString))  { return true; }
  else if (lineString.indexOf("Promethium Lockbox") >= 0) { return true; }
  else { return false; }
}


function isGear(lineString)
{
  for (var i=0; i<armorCollection.length; i++) {
    if (lineString == armorCollection[i].name) {
      return true;
    }
  }
  return false;

  // Below was just for testing to see if I recorded all the gear into a collection

  var gearArray = [ "Galea", "Cowl", "Helm", "Mask", "Cranium", "Hood", "Hat", "Head",
                    "Pack", "Back", "Cape", "Cloak", "Aeroplates", "Mantle", "Wings", "Thrusters",
                    "Chest", "Shirt", "Breast", "Hoodie", "Harness",
                    "Leg", "Pants", "Pteruges", "Greaves", "Kilt",
                    "Shoulder", "Pauldron", "Spaulder",
                    "Gauntlet", "Glove", "grip", "Grasp", "Hand",
                    "Belt", "Waist", "Cincture", "Sash", "Cinch", "Girdle",
                    "Boot", "Greave", "Tread", "Foot", "Stomp", "Sabaton" ];

  if ((lineString.indexOf(" Headline") >= 0) ||
      (lineString.indexOf(" Handbook") >= 0) ||
      (lineString.indexOf(" Package") >= 0) ||
      (lineString.indexOf("Circuitry") >= 0)) {
    return false;
  }

  for (var i=0; i<gearArray.length; i++) {
    if (lineString.indexOf(gearArray[i]) >= 0) {
      console.log("Unstored armor: " + lineString);
      return true;
    }
  }
  return false;
}

function isAccessory(lineString)
{
  var faceArray = [ "Shades", "Goggles", "Mask", "Glasses", "Eyepatch", "Visage", "Visor" ];
  var ringArray = [ "Band", "Clutch", "Loop", "Ring", "Circle", "Insignia" ];
  var neckArray = [ "Neck", "Medallion", "Choker", "Clutch", "Gorget", "Pendant", "Amulet", "Chain", "Locket" ];

  for (var i=0; i<faceArray.length; i++) {
    if (lineString.indexOf(faceArray[i]) >= 0) {
      return true;
    }
  }
  for (var i=0; i<ringArray.length; i++) {
    if (lineString.indexOf(ringArray[i]) >= 0) {
      return true;
    }
  }
  for (var i=0; i<neckArray.length; i++) {
    if (lineString.indexOf(neckArray[i]) >= 0) {
      return true;
    }
  }
  return false;
}



/* Weapons to add

OmniScry Paramount-Line Hand Cannons

*/

/* Armor to add


Sawbones' Avatar Cincture
Sawbones' Avatar Helmet
Sawbones' Avatar Legplates
Sawbones' Avatar Shoulderplates
Sawbones' Avatar Treads
Sharded Shoulderguards

*/



// Only one to do this once since static; global

  var armorCollection = [];

armorCollection.push({name:"Aggressive Invader's Girdle",        type:"Waist",    role:"DPS",style:"Brainiac Invader",drops:"South Gotham Courthouse"});

  armorCollection.push({name:"Amazonian Arbiter's Breastplate",    type:"Chest",    role:"Controller",style:"Amazonian",drops:"T4 Themyscira: The Gates of Tartarus"});
  armorCollection.push({name:"Amazonian Arbiter's Galea",          type:"Head",     role:"Controller",style:"Amazonian",drops:"T4 Themyscira: The Gates of Tartarus"});
  armorCollection.push({name:"Amazonian Arbiter's Gauntlets",      type:"Hands",    role:"Controller",style:"Amazonian",drops:"T4 Themyscira: The Gates of Tartarus"});
  armorCollection.push({name:"Amazonian Hippocratic Belt",         type:"Waist",    role:"Healer",style:"Amazonian",drops:"T4 Themyscira: The Gates of Tartarus"});
  armorCollection.push({name:"Amazonian Hippocratic Greaves",      type:"Legs",     role:"Healer",style:"Amazonian",drops:"T4 Themyscira: The Gates of Tartarus"});
  armorCollection.push({name:"Amazonian Lancer's Belt",            type:"Waist",    role:"DPS",style:"Amazonian",drops:"T4 Themyscira: The Gates of Tartarus"});
  armorCollection.push({name:"Amazonian Lancer's Pteruges",        type:"Legs",     role:"DPS",style:"Amazonian",drops:"T4 Themyscira: The Gates of Tartarus"});
  armorCollection.push({name:"Amazonian Vanguard's Cape",          type:"Back",     role:"Tank",style:"Amazonian",drops:"T4 Themyscira: The Gates of Tartarus"});
  armorCollection.push({name:"Amazonian Vanguard's Galea",         type:"Head",     role:"Tank",style:"Amazonian",drops:"T4 Themyscira: The Gates of Tartarus"});

  armorCollection.push({name:"Lion's Breastplate of the Overseer", type:"Chest",    role:"Controller",style:"Heart of the Lion",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Lion's Legplates of the Overseer",   type:"Legs",     role:"Controller",style:"Heart of the Lion",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Lion's Helm of the Overseer",        type:"Head",     role:"Controller",style:"Heart of the Lion",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Lion's Pauldrons of the Overseer",   type:"Shoulders",role:"Controller",style:"Heart of the Lion",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Overseer's Gauntlets of the Lion",   type:"Hands",    role:"Controller",style:"Heart of the Lion",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Lion's Girdle of the Overseer",      type:"Waist",    role:"Controller",style:"Heart of the Lion",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Overseer's Boots of the Lion",       type:"Feet",     role:"Controller",style:"Heart of the Lion",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Overseer's Cloak of the Lion",       type:"Back",     role:"Controller",style:"Heart of the Lion",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});

  armorCollection.push({name:"Rampant Lion's Chestplate",          type:"Chest",    role:"DPS",style:"Heart of the Lion",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Legplates of the Rampant Lion",      type:"Legs",     role:"DPS",style:"Heart of the Lion",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Helm of the Rampant Lion",           type:"Head",     role:"DPS",style:"Heart of the Lion",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Pauldrons of the Rampant Lion",      type:"Shoulders",role:"DPS",style:"Heart of the Lion",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Rampant Lion's Gauntlets",           type:"Hands",    role:"DPS",style:"Heart of the Lion",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Rampant Lion's Girdle",              type:"Waist",    role:"DPS",style:"Heart of the Lion",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Greaves of the Rampant Lion",        type:"Feet",     role:"DPS",style:"Heart of the Lion",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Cloak of the Rampant Lion",          type:"Back",     role:"DPS",style:"Heart of the Lion",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});

  armorCollection.push({name:"Chestplate of the Triumphant Lion",  type:"Chest",    role:"Tank",style:"Heart of the Lion",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Lion's Triumphant Legplates",        type:"Legs",     role:"Tank",style:"Heart of the Lion",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Lion's Helm of Triumph",             type:"Head",     role:"Tank",style:"Heart of the Lion",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Triumphant Lion's Pauldrons",        type:"Shoulders",role:"Tank",style:"Heart of the Lion",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Gauntlets of the Triumphant Lion",   type:"Hands",    role:"Tank",style:"Heart of the Lion",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Girdle of the Triumphant Lion",      type:"Waist",    role:"Tank",style:"Heart of the Lion",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Triumphant Lion's Greaves",          type:"Feet",     role:"Tank",style:"Heart of the Lion",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Lion's cloak of Triumph",            type:"Back",     role:"Tank",style:"Heart of the Lion",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});

  armorCollection.push({name:"Breastplate of the Wizened Lion",    type:"Chest",    role:"Healer",style:"Heart of the Lion",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Lion's Legplates of the Wizened",    type:"Legs",     role:"Healer",style:"Heart of the Lion",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Lion's Helm of the Wizened",         type:"Head",     role:"Healer",style:"Heart of the Lion",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Wizened Pauldrons of the Lion",      type:"Shoulders",role:"Healer",style:"Heart of the Lion",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Gauntlets of the Wizened Lion",      type:"Hands",    role:"Healer",style:"Heart of the Lion",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Wizened Girdle of the Lion",         type:"Waist",    role:"Healer",style:"Heart of the Lion",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Greaves of the Wizened Lion",        type:"Feet",     role:"Healer",style:"Heart of the Lion",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Lion's Cloak of the Wizened",        type:"Back",     role:"Healer",style:"Heart of the Lion",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});


  armorCollection.push({name:"Ram's Chestplate of Battering",      type:"Chest",    role:"DPS",   style:"Strength of the Ram",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Ram's Legplates of Battering",       type:"Legs",     role:"DPS",   style:"Strength of the Ram",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Ram's Helm of Battering",            type:"Head",     role:"DPS",   style:"Strength of the Ram",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Ram's Pauldrons of Battering",       type:"Shoulders",role:"DPS",   style:"Strength of the Ram",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Ram's Gauntlets of Battering",       type:"Hands",    role:"DPS",   style:"Strength of the Ram",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Ram's Girdle of Battering",          type:"Waist",    role:"DPS",   style:"Strength of the Ram",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Ram's Boots of Battering",           type:"Feet",     role:"DPS",   style:"Strength of the Ram",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Ram's Cloak of Battering",           type:"Back",     role:"DPS",   style:"Strength of the Ram",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});

  armorCollection.push({name:"Breastplate of the Indomitable Ram", type:"Chest",    role:"Tank",  style:"Strength of the Ram",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Legplates of the Indomitable Ram",   type:"Legs",     role:"Tank",  style:"Strength of the Ram",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Helm of the Indomitable Ram",        type:"Head",     role:"Tank",  style:"Strength of the Ram",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Pauldrons of the Indomitable Ram",   type:"Shoulders",role:"Tank",  style:"Strength of the Ram",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Gauntlets of the Indomitable Ram",   type:"Hands",    role:"Tank",  style:"Strength of the Ram",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Belt of the Indomitable Ram",        type:"Waist",    role:"Tank",  style:"Strength of the Ram",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Greaves of the Indomitable Ram",     type:"Feet",     role:"Tank",  style:"Strength of the Ram",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Cape of the Indomitable Ram",        type:"Back",     role:"Tank",  style:"Strength of the Ram",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});

  armorCollection.push({name:"Ram's Chestpiece of Healing",        type:"Chest",    role:"Healer",style:"Strength of the Ram",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Ram's Legplates of Healing",         type:"Legs",     role:"Healer",style:"Strength of the Ram",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Ram's Helm of Healing",              type:"Head",     role:"Healer",style:"Strength of the Ram",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Ram's Shoulderplates of Healing",    type:"Shoulders",role:"Healer",style:"Strength of the Ram",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Ram's Gloves of Healing",            type:"Hands",    role:"Healer",style:"Strength of the Ram",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Ram's Belt of Healing",              type:"Waist",    role:"Healer",style:"Strength of the Ram",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Ram's Boots of Healing",             type:"Feet",     role:"Healer",style:"Strength of the Ram",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Ram's Cloak of Healing",             type:"Back",     role:"Healer",style:"Strength of the Ram",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});

  armorCollection.push({name:"Ram's Chestpiece of the Warlock",    type:"Chest",    role:"Controller",style:"Strength of the Ram",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Ram's Legplates of the Warlock",     type:"Legs",     role:"Controller",style:"Strength of the Ram",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Ram's Helm of the Warlock",          type:"Head",     role:"Controller",style:"Strength of the Ram",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Ram's Shoulderplates of the Warlock",type:"Shoulders",role:"Controller",style:"Strength of the Ram",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Ram's Gloves of the Warlock",        type:"Hands",    role:"Controller",style:"Strength of the Ram",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Ram's Belt of the Warlock",          type:"Waist",    role:"Controller",style:"Strength of the Ram",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Ram's Boots of the Warlock",         type:"Feet",     role:"Controller",style:"Strength of the Ram",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Ram's Cloak of the Warlock",         type:"Back",     role:"Controller",style:"Strength of the Ram",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});

  armorCollection.push({name:"Aggressive Chestplate of the Stag",    type:"Chest",    role:"DPS",   style:"Spirit of the Stag",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Aggressive Legplates of the Stag",     type:"Legs",     role:"DPS",   style:"Spirit of the Stag",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Aggressive Helm of the Stag",          type:"Head",     role:"DPS",   style:"Spirit of the Stag",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Aggressive Shoulderplates of the Stag",type:"Shoulders",role:"DPS",   style:"Spirit of the Stag",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Aggressive Gauntlets of the Stag",     type:"Hands",    role:"DPS",   style:"Spirit of the Stag",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Aggressive Girdle of the Stag",        type:"Waist",    role:"DPS",   style:"Spirit of the Stag",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Aggressive Greaves of the Stag",       type:"Feet",     role:"DPS",   style:"Spirit of the Stag",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Aggressive Cape of the Stag",          type:"Back",     role:"DPS",   style:"Spirit of the Stag",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});

  armorCollection.push({name:"Chestplate of the Resilient Stag",    type:"Chest",    role:"Tank",   style:"Spirit of the Stag",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Legplates of the Resilient Stag",     type:"Legs",     role:"Tank",   style:"Spirit of the Stag",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Helm of the Resilient Stag",          type:"Head",     role:"Tank",   style:"Spirit of the Stag",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Shoulderplates of the Resilient Stag",type:"Shoulders",role:"Tank",   style:"Spirit of the Stag",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Gauntlets of the Resilient Stag",     type:"Hands",    role:"Tank",   style:"Spirit of the Stag",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Girdle of the Resilient Stag",        type:"Waist",    role:"Tank",   style:"Spirit of the Stag",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Boots of the Resilient Stag",         type:"Feet",     role:"Tank",   style:"Spirit of the Stag",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Cape of the Resilient Stag",          type:"Back",     role:"Tank",   style:"Spirit of the Stag",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});

  armorCollection.push({name:"Stag's Breastplate of Restoration",   type:"Chest",    role:"Healer",     style:"Spirit of the Stag",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Stag's Legguards of Restoration",     type:"Legs",     role:"Healer",     style:"Spirit of the Stag",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Stag's Helm of Restoration",          type:"Head",     role:"Healer",     style:"Spirit of the Stag",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Stag's Pauldrons of Restoration",     type:"Shoulders",role:"Healer",     style:"Spirit of the Stag",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Stag's Gloves of Restoration",        type:"Hands",    role:"Healer",     style:"Spirit of the Stag",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Stag's Belt of Restoration",          type:"Waist",    role:"Healer",     style:"Spirit of the Stag",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Stag's Boots of Restoration",         type:"Feet",     role:"Healer",     style:"Spirit of the Stag",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Stag's Cape of Restoration",          type:"Back",     role:"Healer",     style:"Spirit of the Stag",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});

  armorCollection.push({name:"Breastplate of the Mystic Stag",      type:"Chest",    role:"Controller", style:"Spirit of the Stag",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Legguards of the Mystic Stag",        type:"Legs",     role:"Controller", style:"Spirit of the Stag",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Helm of the Mystic Stag",             type:"Head",     role:"Controller", style:"Spirit of the Stag",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Shoulders of the Mystic Stag",        type:"Shoulders",role:"Controller", style:"Spirit of the Stag",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Gloves of the Mystic Stag",           type:"Hands",    role:"Controller", style:"Spirit of the Stag",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Waistband of the Mystic Stag",        type:"Waist",    role:"Controller", style:"Spirit of the Stag",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Boots of the Mystic Stag",            type:"Feet",     role:"Controller", style:"Spirit of the Stag",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Cloak of the Mystic Stag",            type:"Back",     role:"Controller", style:"Spirit of the Stag",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});

  armorCollection.push({name:"Raging Aurochs' Chestplate",          type:"Chest",    role:"DPS",        style:"The Last Aurochs",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Raging Aurochs' Legplates",           type:"Legs",     role:"DPS",        style:"The Last Aurochs",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Raging Aurochs' Helm",                type:"Head",     role:"DPS",        style:"The Last Aurochs",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Raging Aurochs' Pauldrons",           type:"Shoulders",role:"DPS",        style:"The Last Aurochs",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Raging Aurochs' Gauntlets",           type:"Hands",    role:"DPS",        style:"The Last Aurochs",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Raging Aurochs' Girdle",              type:"Waist",    role:"DPS",        style:"The Last Aurochs",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Raging Aurochs' Greaves",             type:"Feet",     role:"DPS",        style:"The Last Aurochs",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Raging Aurochs' Cape",                type:"Back",     role:"DPS",        style:"The Last Aurochs",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});

  armorCollection.push({name:"Ironclad Auroch's Chestplate",        type:"Chest",    role:"Tank",       style:"The Last Aurochs",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Ironclad Auroch's Legplates",         type:"Legs",     role:"Tank",       style:"The Last Aurochs",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Ironclad Auroch's Helm",              type:"Head",     role:"Tank",       style:"The Last Aurochs",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Ironclad Auroch's Pauldrons",         type:"Shoulders",role:"Tank",       style:"The Last Aurochs",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Ironclad Auroch's Gauntlets",         type:"Hands",    role:"Tank",       style:"The Last Aurochs",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Ironclad Auroch's Girdle",            type:"Waist",    role:"Tank",       style:"The Last Aurochs",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Ironclad Auroch's Greaves",           type:"Feet",     role:"Tank",       style:"The Last Aurochs",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Ironclad Auroch's Cape",              type:"Back",     role:"Tank",       style:"The Last Aurochs",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});

  armorCollection.push({name:"Chestplate of the Zealous Aurochs",   type:"Chest",    role:"Healer",     style:"The Last Aurochs",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Legplates of the Zealous Aurochs",    type:"Legs",     role:"Healer",     style:"The Last Aurochs",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Helm of the Zealous Aurochs",         type:"Head",     role:"Healer",     style:"The Last Aurochs",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Pauldrons of the Zealous Aurochs",    type:"Shoulders",role:"Healer",     style:"The Last Aurochs",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Gauntlets of the Zealous Aurochs",    type:"Hands",    role:"Healer",     style:"The Last Aurochs",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Girdle of the Zealous Aurochs",       type:"Waist",    role:"Healer",     style:"The Last Aurochs",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Greaves of the Zealous Aurochs",      type:"Feet",     role:"Healer",     style:"The Last Aurochs",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Cape of the Zealous Aurochs",         type:"Back",     role:"Healer",     style:"The Last Aurochs",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});

  armorCollection.push({name:"Chestplate of the Defiant Aurochs",   type:"Chest",    role:"Controller", style:"The Last Aurochs",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Legplates of the Defiant Aurochs",    type:"Legs",     role:"Controller", style:"The Last Aurochs",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Helm of the Defiant Aurochs",         type:"Head",     role:"Controller", style:"The Last Aurochs",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Pauldrons of the Defiant Aurochs",    type:"Shoulders",role:"Controller", style:"The Last Aurochs",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Gauntlets of the Defiant Aurochs",    type:"Hands",    role:"Controller", style:"The Last Aurochs",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Girdle of the Defiant Aurochs",       type:"Waist",    role:"Controller", style:"The Last Aurochs",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Greaves of the Defiant Aurochs",      type:"Feet",     role:"Controller", style:"The Last Aurochs",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});
  armorCollection.push({name:"Cape of the Defiant Aurochs",         type:"Back",     role:"Controller", style:"The Last Aurochs",drops:"T4 Terminal in Arcane Battle Gear room of Magic Wing in Watchtower"});

  armorCollection.push({name:"Benevolent Seneschal's Breastplate",  type:"Chest",    role:"DPS",        style:"Virtuous Knight", drops:"Hall of Heroes room in Watchtower, Requisitions T3H PvP vendor"});
  armorCollection.push({name:"Benevolent Seneschal's Cuisses",      type:"Legs",     role:"DPS",        style:"Virtuous Knight", drops:"Hall of Heroes room in Watchtower, Requisitions T3H PvP vendor"});
  armorCollection.push({name:"Benevolent Seneschal's Armet",        type:"Head",     role:"DPS",        style:"Virtuous Knight", drops:"Hall of Heroes room in Watchtower, Requisitions T3H PvP vendor"});
  armorCollection.push({name:"Benevolent Seneschal's Spaulders",    type:"Shoulders",role:"DPS",        style:"Virtuous Knight", drops:"Hall of Heroes room in Watchtower, Requisitions T3H PvP vendor"});
  armorCollection.push({name:"Benevolent Seneschal's Vambraces",    type:"Hands",    role:"DPS",        style:"Virtuous Knight", drops:"Hall of Heroes room in Watchtower, Requisitions T3H PvP vendor"});
  armorCollection.push({name:"Benevolent Seneschal's Tassets",      type:"Waist",    role:"DPS",        style:"Virtuous Knight", drops:"Hall of Heroes room in Watchtower, Requisitions T3H PvP vendor"});
  armorCollection.push({name:"Benevolent Seneschal's Sollerets",    type:"Feet",     role:"DPS",        style:"Virtuous Knight", drops:"Hall of Heroes room in Watchtower, Requisitions T3H PvP vendor"});
  armorCollection.push({name:"Benevolent Seneschal's Cape",         type:"Back",     role:"DPS",        style:"Virtuous Knight", drops:"Hall of Heroes room in Watchtower, Requisitions T3H PvP vendor"});

  armorCollection.push({name:"Benevolent Guardian's Breastplate",   type:"Chest",    role:"Tank",       style:"Virtuous Knight", drops:"Hall of Heroes room in Watchtower, Requisitions T3H PvP vendor"});
  armorCollection.push({name:"Benevolent Guardian's Cuisses",       type:"Legs",     role:"Tank",       style:"Virtuous Knight", drops:"Hall of Heroes room in Watchtower, Requisitions T3H PvP vendor"});
  armorCollection.push({name:"Benevolent Guardian's Armet",         type:"Head",     role:"Tank",       style:"Virtuous Knight", drops:"Hall of Heroes room in Watchtower, Requisitions T3H PvP vendor"});
  armorCollection.push({name:"Benevolent Guardian's Spaulders",     type:"Shoulders",role:"Tank",       style:"Virtuous Knight", drops:"Hall of Heroes room in Watchtower, Requisitions T3H PvP vendor"});
  armorCollection.push({name:"Benevolent Guardian's Vambraces",     type:"Hands",    role:"Tank",       style:"Virtuous Knight", drops:"Hall of Heroes room in Watchtower, Requisitions T3H PvP vendor"});
  armorCollection.push({name:"Benevolent Guardian's Tassets",       type:"Waist",    role:"Tank",       style:"Virtuous Knight", drops:"Hall of Heroes room in Watchtower, Requisitions T3H PvP vendor"});
  armorCollection.push({name:"Benevolent Guardian's Sollerets",     type:"Feet",     role:"Tank",       style:"Virtuous Knight", drops:"Hall of Heroes room in Watchtower, Requisitions T3H PvP vendor"});
  armorCollection.push({name:"Benevolent Guardian's Cape",          type:"Back",     role:"Tank",       style:"Virtuous Knight", drops:"Hall of Heroes room in Watchtower, Requisitions T3H PvP vendor"});

  armorCollection.push({name:"Benevolent Herald's Breastplate",     type:"Chest",    role:"Healer",     style:"Virtuous Knight", drops:"Hall of Heroes room in Watchtower, Requisitions T3H PvP vendor"});
  armorCollection.push({name:"Benevolent Herald's Cuisses",         type:"Legs",     role:"Healer",     style:"Virtuous Knight", drops:"Hall of Heroes room in Watchtower, Requisitions T3H PvP vendor"});
  armorCollection.push({name:"Benevolent Herald's Armet",           type:"Head",     role:"Healer",     style:"Virtuous Knight", drops:"Hall of Heroes room in Watchtower, Requisitions T3H PvP vendor"});
  armorCollection.push({name:"Benevolent Herald's Spaulders",       type:"Shoulders",role:"Healer",     style:"Virtuous Knight", drops:"Hall of Heroes room in Watchtower, Requisitions T3H PvP vendor"});
  armorCollection.push({name:"Benevolent Herald's Vambraces",       type:"Hands",    role:"Healer",     style:"Virtuous Knight", drops:"Hall of Heroes room in Watchtower, Requisitions T3H PvP vendor"});
  armorCollection.push({name:"Benevolent Herald's Tassets",         type:"Waist",    role:"Healer",     style:"Virtuous Knight", drops:"Hall of Heroes room in Watchtower, Requisitions T3H PvP vendor"});
  armorCollection.push({name:"Benevolent Herald's Sollerets",       type:"Feet",     role:"Healer",     style:"Virtuous Knight", drops:"Hall of Heroes room in Watchtower, Requisitions T3H PvP vendor"});
  armorCollection.push({name:"Benevolent Herald's Cape",            type:"Back",     role:"Healer",     style:"Virtuous Knight", drops:"Hall of Heroes room in Watchtower, Requisitions T3H PvP vendor"});

  armorCollection.push({name:"Benevolent Majordomo's Breastplate",  type:"Chest",    role:"Controller", style:"Virtuous Knight", drops:"Hall of Heroes room in Watchtower, Requisitions T3H PvP vendor"});
  armorCollection.push({name:"Benevolent Majordomo's Cuisses",      type:"Legs",     role:"Controller", style:"Virtuous Knight", drops:"Hall of Heroes room in Watchtower, Requisitions T3H PvP vendor"});
  armorCollection.push({name:"Benevolent Majordomo's Armet",        type:"Head",     role:"Controller", style:"Virtuous Knight", drops:"Hall of Heroes room in Watchtower, Requisitions T3H PvP vendor"});
  armorCollection.push({name:"Benevolent Majordomo's Spaulders",    type:"Shoulders",role:"Controller", style:"Virtuous Knight", drops:"Hall of Heroes room in Watchtower, Requisitions T3H PvP vendor"});
  armorCollection.push({name:"Benevolent Majordomo's Vambraces",    type:"Hands",    role:"Controller", style:"Virtuous Knight", drops:"Hall of Heroes room in Watchtower, Requisitions T3H PvP vendor"});
  armorCollection.push({name:"Benevolent Majordomo's Tassets",      type:"Waist",    role:"Controller", style:"Virtuous Knight", drops:"Hall of Heroes room in Watchtower, Requisitions T3H PvP vendor"});
  armorCollection.push({name:"Benevolent Majordomo's Sollerets",    type:"Feet",     role:"Controller", style:"Virtuous Knight", drops:"Hall of Heroes room in Watchtower, Requisitions T3H PvP vendor"});
  armorCollection.push({name:"Benevolent Majordomo's Cape",         type:"Back",     role:"Controller", style:"Virtuous Knight", drops:"Hall of Heroes room in Watchtower, Requisitions T3H PvP vendor"});

  armorCollection.push({name:"Informant's Assault Jacket",          type:"Chest",    role:"DPS",        style:"Checkmate Informant", drops:"Hall of Heroes room in Watchtower, Requisitions T4H PvP vendor"});
  armorCollection.push({name:"Informant's Assault Trousers",        type:"Legs",     role:"DPS",        style:"Checkmate Informant", drops:"Hall of Heroes room in Watchtower, Requisitions T4H PvP vendor"});
  armorCollection.push({name:"Informant's Assault Helmet",          type:"Head",     role:"DPS",        style:"Checkmate Informant", drops:"Hall of Heroes room in Watchtower, Requisitions T4H PvP vendor"});
  armorCollection.push({name:"Informant's Assault Shoulderguards",  type:"Shoulders",role:"DPS",        style:"Checkmate Informant", drops:"Hall of Heroes room in Watchtower, Requisitions T4H PvP vendor"});
  armorCollection.push({name:"Informant's Assault Gloves",          type:"Hands",    role:"DPS",        style:"Checkmate Informant", drops:"Hall of Heroes room in Watchtower, Requisitions T4H PvP vendor"});
  armorCollection.push({name:"Informant's Assault Utilibelt",       type:"Waist",    role:"DPS",        style:"Checkmate Informant", drops:"Hall of Heroes room in Watchtower, Requisitions T4H PvP vendor"});
  armorCollection.push({name:"Informant's Assault Boots",           type:"Feet",     role:"DPS",        style:"Checkmate Informant", drops:"Hall of Heroes room in Watchtower, Requisitions T4H PvP vendor"});
  armorCollection.push({name:"Informant's Assault Pack",            type:"Back",     role:"DPS",        style:"Checkmate Informant", drops:"Hall of Heroes room in Watchtower, Requisitions T4H PvP vendor"});

  armorCollection.push({name:"Informant's Armored Jacket",          type:"Chest",    role:"Tank",       style:"Checkmate Informant", drops:"Hall of Heroes room in Watchtower, Requisitions T4H PvP vendor"});
  armorCollection.push({name:"Informant's Armored Trousers",        type:"Legs",     role:"Tank",       style:"Checkmate Informant", drops:"Hall of Heroes room in Watchtower, Requisitions T4H PvP vendor"});
  armorCollection.push({name:"Informant's Armored Helmet",          type:"Head",     role:"Tank",       style:"Checkmate Informant", drops:"Hall of Heroes room in Watchtower, Requisitions T4H PvP vendor"});
  armorCollection.push({name:"Informant's Armored Shoulderguards",  type:"Shoulders",role:"Tank",       style:"Checkmate Informant", drops:"Hall of Heroes room in Watchtower, Requisitions T4H PvP vendor"});
  armorCollection.push({name:"Informant's Armored Gloves",          type:"Hands",    role:"Tank",       style:"Checkmate Informant", drops:"Hall of Heroes room in Watchtower, Requisitions T4H PvP vendor"});
  armorCollection.push({name:"Informant's Armored Utilibelt",       type:"Waist",    role:"Tank",       style:"Checkmate Informant", drops:"Hall of Heroes room in Watchtower, Requisitions T4H PvP vendor"});
  armorCollection.push({name:"Informant's Armored Boots",           type:"Feet",     role:"Tank",       style:"Checkmate Informant", drops:"Hall of Heroes room in Watchtower, Requisitions T4H PvP vendor"});
  armorCollection.push({name:"Informant's Armored Pack",            type:"Back",     role:"Tank",       style:"Checkmate Informant", drops:"Hall of Heroes room in Watchtower, Requisitions T4H PvP vendor"});

  armorCollection.push({name:"Informant's Medical Jacket",               type:"Chest",     role:"Healer",     style:"Checkmate Informant", drops:"Hall of Heroes room in Watchtower, Requisitions T4H PvP vendor"});
  armorCollection.push({name:"Informant's Medical Trousers",             type:"Legs",      role:"Healer",     style:"Checkmate Informant", drops:"Hall of Heroes room in Watchtower, Requisitions T4H PvP vendor"});
  armorCollection.push({name:"Informant's Medical Helmet",               type:"Head",      role:"Healer",     style:"Checkmate Informant", drops:"Hall of Heroes room in Watchtower, Requisitions T4H PvP vendor"});
  armorCollection.push({name:"Informant's Medical Shoulderguards",       type:"Shoulders", role:"Healer",     style:"Checkmate Informant", drops:"Hall of Heroes room in Watchtower, Requisitions T4H PvP vendor"});
  armorCollection.push({name:"Informant's Medical Gloves",               type:"Hands",     role:"Healer",     style:"Checkmate Informant", drops:"Hall of Heroes room in Watchtower, Requisitions T4H PvP vendor"});
  armorCollection.push({name:"Informant's Medical Utilibelt",            type:"Waist",     role:"Healer",     style:"Checkmate Informant", drops:"Hall of Heroes room in Watchtower, Requisitions T4H PvP vendor"});
  armorCollection.push({name:"Informant's Medical Boots",                type:"Feet",      role:"Healer",     style:"Checkmate Informant", drops:"Hall of Heroes room in Watchtower, Requisitions T4H PvP vendor"});
  armorCollection.push({name:"Informant's Medical Pack",                 type:"Back",      role:"Healer",     style:"Checkmate Informant", drops:"Hall of Heroes room in Watchtower, Requisitions T4H PvP vendor"});

  armorCollection.push({name:"Informant's Authoritarian Jacket",         type:"Chest",     role:"Controller", style:"Checkmate Informant", drops:"Hall of Heroes room in Watchtower, Requisitions T4H PvP vendor"});
  armorCollection.push({name:"Informant's Authoritarian Trousers",       type:"Legs",      role:"Controller", style:"Checkmate Informant", drops:"Hall of Heroes room in Watchtower, Requisitions T4H PvP vendor"});
  armorCollection.push({name:"Informant's Authoritarian Helmet",         type:"Head",      role:"Controller", style:"Checkmate Informant", drops:"Hall of Heroes room in Watchtower, Requisitions T4H PvP vendor"});
  armorCollection.push({name:"Informant's Authoritarian Shoulderguards", type:"Shoulders", role:"Controller", style:"Checkmate Informant", drops:"Hall of Heroes room in Watchtower, Requisitions T4H PvP vendor"});
  armorCollection.push({name:"Informant's Authoritarian Gloves",         type:"Hands",     role:"Controller", style:"Checkmate Informant", drops:"Hall of Heroes room in Watchtower, Requisitions T4H PvP vendor"});
  armorCollection.push({name:"Informant's Authoritarian Utilibelt",      type:"Waist",     role:"Controller", style:"Checkmate Informant", drops:"Hall of Heroes room in Watchtower, Requisitions T4H PvP vendor"});
  armorCollection.push({name:"Informant's Authoritarian Boots",          type:"Feet",      role:"Controller", style:"Checkmate Informant", drops:"Hall of Heroes room in Watchtower, Requisitions T4H PvP vendor"});
  armorCollection.push({name:"Informant's Authoritarian Pack",           type:"Back",      role:"Controller", style:"Checkmate Informant", drops:"Hall of Heroes room in Watchtower, Requisitions T4H PvP vendor"});

  armorCollection.push({name:"Operative's Assault Jacket",               type:"Chest",     role:"DPS",        style:"Checkmate Operative", drops:"Hall of Heroes room in Watchtower, Requisitions T4H PvP vendor"});
  armorCollection.push({name:"Operative's Assault Trousers",             type:"Legs",      role:"DPS",        style:"Checkmate Operative", drops:"Hall of Heroes room in Watchtower, Requisitions T4H PvP vendor"});
  armorCollection.push({name:"Operative's Assault Helmet",               type:"Head",      role:"DPS",        style:"Checkmate Operative", drops:"Hall of Heroes room in Watchtower, Requisitions T4H PvP vendor"});
  armorCollection.push({name:"Operative's Assault Shoulderguards",       type:"Shoulders", role:"DPS",        style:"Checkmate Operative", drops:"Hall of Heroes room in Watchtower, Requisitions T4H PvP vendor"});
  armorCollection.push({name:"Operative's Assault Gloves",               type:"Hands",     role:"DPS",        style:"Checkmate Operative", drops:"Hall of Heroes room in Watchtower, Requisitions T4H PvP vendor"});
  armorCollection.push({name:"Operative's Assault Utilibelt",            type:"Waist",     role:"DPS",        style:"Checkmate Operative", drops:"Hall of Heroes room in Watchtower, Requisitions T4H PvP vendor"});
  armorCollection.push({name:"Operative's Assault Boots",                type:"Feet",      role:"DPS",        style:"Checkmate Operative", drops:"Hall of Heroes room in Watchtower, Requisitions T4H PvP vendor"});
  armorCollection.push({name:"Operative's Assault Pack",                 type:"Back",      role:"DPS",        style:"Checkmate Operative", drops:"Hall of Heroes room in Watchtower, Requisitions T4H PvP vendor"});

  armorCollection.push({name:"Furious Avatar Exoskeleton",               type:"Chest",     role:"DPS",        style:"Avatar Bombardier",   drops:"Hall of Heroes room in Watchtower, Requisitions T2H PvP vendor"});

  armorCollection.push({name:"Breastplate of the Ardent Paladin",type:"Chest",role:"DPS",style:"Medieval",drops:"Brainiac Guardian MK-III"});
  armorCollection.push({name:"Gauntlets of the Planar Shift",type:"Hands",role:"DPS",style:"Astral Alloy",drops:"Subavatar - South Gotham"});
  armorCollection.push({name:"New Urban Formal Pants",type:"Legs",role:"DPS",style:"Urban Business",drops:"Subavatar - South Gotham"});
  armorCollection.push({name:"Reinforced Invader's Helmet",type:"Head",role:"DPS",style:"Brainiac Invader",drops:"The Attorneys South Gotham Courthouse"});
  armorCollection.push({name:"Ryut Shoulderpads",type:"Shoulders",role:"DPS",style:"Ryut",drops:"Atrocitus - Coast City"});
  armorCollection.push({name:"Training Pants of the Martialist",type:"Legs",role:"DPS",style:"Kung-Fu Gi",drops:"Subavatar"});



  // Head
  armorCollection.push({name:"Abyssal Helmet",type:"Head",role:"DPS",style:"Demonic",drops:"Possessed Raven Spirit, Spirit of Raven - Science Police HQ (Challlenge)"});
  armorCollection.push({name:"Advanced ServitorGuard Helmet",type:"Head",role:"DPS",style:"Retro Tech",drops:"Batman"});
  armorCollection.push({name:"Alloyed Synthium Helmet",type:"Head",role:"DPS",style:"Contemporary Tech",drops:"UGA Commando"});
  armorCollection.push({name:"Amazonian Hippocratic Galea",type:"Head",role:"Healer",style:"Amazonian",drops:"T4 Themyscira: The Gates of Tartarus"});
  armorCollection.push({name:"Amazonian Lancer's Galea",type:"Head",role:"DPS",style:"Amazonian",drops:"Brainiac Swarm Master - T4 Themyscira: The Gates of Tartarus"});
  armorCollection.push({name:"Ancient Qwardian Helmet",type:"Head",role:"DPS",style:"",drops:"Present in Vault"});
  armorCollection.push({name:"Android Batman's Cowl",type:"Head",role:"DPS",style:"Robot Batman",drops:"OMAC Batman"});
  armorCollection.push({name:"Antifreeze Helmet",type:"Head",role:"DPS",style:"Antifreeze",drops:"Present in Vault"});
  armorCollection.push({name:"Ardent Paladin's Helm",type:"Head",role:"Healer",style:"Medieval",drops:"Brainiac Guardian MK-III"});
  armorCollection.push({name:"Avatar Infiltrator's Helmet",type:"Head",role:"DPS",style:"Avatar Infiltrator",drops:"Sunstone Domineer - Fortress of Solitude: The Chasm"});
  armorCollection.push({name:"Banded Champion Mask",type:"Head",role:"Tank",style:"Segmented Flexsuit",drops:"Pied Piper - Cosmic Treadmill: Flashback"});
  armorCollection.push({name:"Battlelord's Helm",type:"Head",role:"Tank",style:"Viking",drops:"Prime Servitor"});
  armorCollection.push({name:"Bioshaped Helm of Recovery",type:"Head",role:"Healer",style:"Alien Tech",drops:"Penguin"});
  armorCollection.push({name:"Bizarro Cap",type:"Head",role:"DPS",style:"Bizarro Cap",drops:"Present in Vault"});
  armorCollection.push({name:"Brainiac Joker's Malevolent Mask",type:"Head",role:"DPS",style:"Robot Joker",drops:"The Joker"});
  armorCollection.push({name:"Broodmother's Cranium",type:"Head",role:"DPS",style:"Brainiac Sunstone",drops:"Sunstone Broodmother - Fortress of Solitude: The Chasm"});
  armorCollection.push({name:"Brother Blood's Sinister Hood",type:"Head",role:"DPS",style:"Brother Blood",drops:"Brother Blood"});
  armorCollection.push({name:"Captain Cold's Furred Hood",type:"Head",role:"DPS",style:"Captain Cold",drops:"Rogues"});
  armorCollection.push({name:"Cowl of Justice",type:"Head",role:"Tank",style:"Sunstone Bulwark",drops:"T3 Terminal"});
  armorCollection.push({name:"Crested Helmet of Themyscira",type:"Head",role:"DPS",style:"Greco-Roman",drops:"Present in Vault"});
  armorCollection.push({name:"Crystalline Helm of the Defender",type:"Head",role:"Tank",style:"Kryptonian",drops:"Corrupt Jor-El A.I."});
  armorCollection.push({name:"Dandy's Dashing Hat",type:"Head",role:"DPS",style:"Voodoo",drops:"Charmed Inmate in Arkham Asylum, Envenomed Strongman in Cape Carmine Lighthouse DUO, Panther Fang - Gotham University Warehouse, Pengbot Maximus - Gotham Old Subway Challenge, Worker - Hive Base DUO"});
  armorCollection.push({name:"Dark Visage of the Necropolis",type:"Head",role:"DPS",style:"Contemporary Tech",drops:"Bruno Mannheim"});
  armorCollection.push({name:"Dastardly Top Hat",type:"Head",role:"DPS",style:"Voodoo",drops:"Altered Android - Oolong Island (Hard), Ancient Bloodroot - The Greenhouse (Challenge), Omega Sentry - Batcave: Inner Sanctum, Batcave: Outer Caverns, Worker - Hive Base (Duo)"});
  armorCollection.push({name:"Deathmask of the Spectre",type:"Head",role:"DPS",style:"Spectre",drops:"Eclipso"});
  armorCollection.push({name:"Demonforged Helmet",type:"Head",role:"DPS",style:"Demonic",drops:"Present in Vault"});
  armorCollection.push({name:"Dire Visage of the Demonlord",type:"Head",role:"DPS",style:"Necromancer",drops:"Bloodroot Sapling - The Greenhouse (Challenge), Grodd's Pounders - Gorilla Grodd's Lab (Duo), Lexcorp Scientist - Smallville, Penguin - Gotham Old Subway (Challenge), Soulless Shell - Gotham University (Duo), Tiger Lord - Gotham University Warehouse, Vengeful Spirit - Lair of the Spectre (Challenge)
"});
  armorCollection.push({name:"Dread Coluan Helmet",type:"Head",role:"DPS",style:"Jah Kir",drops:"Present in Vault"});
  armorCollection.push({name:"Dread Horned Helmet",type:"Head",role:"DPS",style:"Necromancer",drops:"Cheetah Lord - Gotham University Warehouse, Eagle Soldier - Kahndaq, Lion Soldier - Kahndaq, Machine Gun Tommy - Gotham Old Subway (Challenge), Soul Striker - Science Police HQ (Challlenge)"});
  armorCollection.push({name:"Elite OMAC Centurion Helmet",type:"Head",role:"DPS",style:"Brother Eye",drops:"OMAC Delta"});
  armorCollection.push({name:"Empowered Mesh Mask",type:"Head",role:"Controller",style:"Webbed Flexsuit",drops:"Pied Piper - Cosmic Treadmill: Flashback"});
  armorCollection.push({name:"Energized Enforcer's Helm",type:"Head",role:"DPS",style:"Oolong",drops:"Prime Assassin"});
  armorCollection.push({name:"Executioner's Promethium Heaume",type:"Head",role:"Tank",style:"Medieval",drops:"Queen Bee"});
  armorCollection.push({name:"Faust's Orichalcum Helm",type:"Head",role:"DPS",style:"Felix Faust",drops:"Felix Faust"});
  armorCollection.push({name:"Fine Synthweave Hat",type:"Head",role:"DPS",style:"Split Personality",drops:"Penguin"});
  armorCollection.push({name:"G.I.'s Helmet",type:"Head",role:"Tank",style:"Military Tech",drops:"Brainiac Guardian MK-XXII"});
  armorCollection.push({name:"Gleaming Pressurized Helm",type:"Head",role:"Tank",style:"Sector Agent",drops:"The Lanterns"});
  armorCollection.push({name:"Harbinger's Coluan Helmet",type:"Head",role:"Controller",style:"Alien Tech",drops:"Dr. Richards"});
  armorCollection.push({name:"Harley's Sinister Masquerade",type:"Head",role:"DPS",style:"Harley Quinn",drops:"Harley Quinn"});
  armorCollection.push({name:"Headpiece of Coercion",type:"Head",role:"Controller",style:"Shaman",drops:"Brainiac Guardian MK-IV in Gotham Hospital T2 Duo"});
  armorCollection.push({name:"Helmet of the Deceiver",type:"Head",role:"DPS",style:"Greco-Roman",drops:"Circe"});
  armorCollection.push({name:"Helm of the Bold",type:"Head",role:"Tank",style:"Heartshard",drops:"Zetta-Drone"});
  armorCollection.push({name:"Helm of the Cosmos",type:"Head",role:"DPS",style:"Astral Alloy",drops:"Avatar of Magic"});
  armorCollection.push({name:"Helm of the Councilor",type:"Head",role:"Healer",style:"Talon Lord",drops:"Corrupt Jor-El A.I."});
  armorCollection.push({name:"Helm of the Just",type:"Head",role:"Healer",style:"Seraph",drops:"Doomsday"});
  armorCollection.push({name:"Hieroglyphic Helm",type:"Head",role:"DPS",style:"Mayan",drops:"Catwoman"});
  armorCollection.push({name:"Hood of the Assassins",type:"Head",role:"DPS",style:"League of Assassins",drops:"Ra's al Ghul"});
  armorCollection.push({name:"Hood of Conquest",type:"Head",role:"Tank",style:"Sunstone Bulwark",drops:"T3 Terminal"});
  armorCollection.push({name:"Horned Helm of the Barbarian Host",type:"Head",role:"DPS",style:"Barbarian",drops:"Soul Striker"});
  armorCollection.push({name:"Irradiant Pressurized Helmet",type:"Head",role:"DPS",style:"Sector Incendiary",drops:"Crazed Amon Sur"});
  armorCollection.push({name:"Kandorian Helmet of Power",type:"Head",role:"DPS",style:"New Genesis",drops:"Present in Vault"});
  armorCollection.push({name:"Kryptonian Defense Helmet",type:"Head",role:"Controller",style:"Kryptonian Commander",drops:"T3 Terminal in Meta Wing"});
  armorCollection.push({name:"Kryptonian Medico Hood",type:"Head",role:"Healer",style:"Sunstone Bulwark",drops:"T3 Terminal"});
  armorCollection.push({name:"Lambent Pressurized Helm",type:"Head",role:"Controller",style:"Sector Agent",drops:"Scion of Fear - Star Labs Alert"});
  armorCollection.push({name:"Laminated Inertron Helmet",type:"Head",role:"Controller",style:"Winged Fury",drops:"Armored Robotic Custodian"});
  armorCollection.push({name:"Laminated Synthium Headguard",type:"Head",role:"DPS",style:"Contemporary Tech",drops:"Treasure Chest - Gotham Star Labs, Gotham University, Lair of the Spectre"});
  armorCollection.push({name:"Lucent Pressurized Helm",type:"Head",role:"Healer",style:"Sector Agent",drops:"Vice"});
  armorCollection.push({name:"Manipulative Invader's Helmet",type:"Head",role:"Controller",style:"Brainiac Invader",drops:"The Attorneys - South Gotham CourtHouse"});
  armorCollection.push({name:"Mask of the Stalker",type:"Head",role:"DPS",style:"Remora",drops:"Sandtiger"});
  armorCollection.push({name:"Military Medico Hood",type:"Head",role:"Healer",style:"Sunstone Bulwark",drops:"T3 Terminal"});
  armorCollection.push({name:"Modern Gorillaweave Headguard",type:"Head",role:"DPS",style:"Insectoid",drops:"Treasure Chest - Metropolis City Hall"});
  armorCollection.push({name:"Mysterious Alien Visor",type:"Head",role:"Tank",style:"Biomech",drops:"Bean in Gorilla Island Alert"});
  armorCollection.push({name:"Networked Inertron Helmet",type:"Head",role:"Controller",style:"Military Tech",drops:"Bane in Cape Carmine Lighthouse DUO"});
  armorCollection.push({name:"Networked Valorium Helmet",type:"Head",role:"Controller",style:"Winged Fury",drops:"OMAC Batman"});
  armorCollection.push({name:"Nth-Metal Helm of the Craft",type:"Head",role:"DPS",style:"Raptor Tech",drops:"General Adnan"});
  armorCollection.push({name:"OmniScry Inertron Helmet",type:"Head",role:"Controller",style:"Military Tech",drops:"Queen Bee"});
  armorCollection.push({name:"Pharaonic War Headdress",type:"Head",role:"DPS",style:"Egyptian",drops:"Present in Vault"});
  armorCollection.push({name:"Precision Nanotube Helm",type:"Head",role:"Tank",style:"Fourth World",drops:"Safe"});
  armorCollection.push({name:"Promethium Helmet of the Elders",type:"Head",role:"Tank",style:"Heartshard",drops:"Bat Family in Batcave: Outer Caverns Raid"});
  armorCollection.push({name:"Raptor Tech Helmet",type:"Head",role:"DPS",style:"Raptor Tech",drops:"OMAC Batman"});
  armorCollection.push({name:"Raven's Soulmask",type:"Head",role:"DPS",style:"Raven",drops:"Raven"});
  armorCollection.push({name:"Riveted Evosynth Helmet",type:"Head",role:"Tank",style:"Contemporary Tech",drops:"Failed Metal Man - Oolong Island, Star-SL - Old STAR Labs"});
  armorCollection.push({name:"Robin Cap",type:"Head",role:"DPS",style:"Robin Cap",drops:"Present in Vault"});
  armorCollection.push({name:"Roggra's Manawoven Helmet",type:"Head",role:"Healer",style:"Shaman",drops:"Two-Face - Gotham Mercy Hospital, Zoom - Gorilla Grodd's Lab"});
  armorCollection.push({name:"Royal Helmet of Shiruta",type:"Head",role:"DPS",style:"Fourth World",drops:""});
  armorCollection.push({name:"Scarecrow's Tattered Helm",type:"Head",role:"DPS",style:"Scarecrow",drops:"Scarecrow"});
  armorCollection.push({name:"Scorpion-Summoner's Helm",type:"Head",role:"DPS",style:"Tech Ninja",drops:""});
  armorCollection.push({name:"Shiruta Militia Leader's Helm",type:"Head",role:"Controller",style:"Antifreeze",drops:"Security Sentry in Outer Raid"});
  armorCollection.push({name:"Simium Headguard",type:"Head",role:"DPS",style:"Biomech",drops:"Present in Vault"});
  armorCollection.push({name:"Solemn Ritual Hood",type:"Head",role:"DPS",style:"Druid",drops:""});
  armorCollection.push({name:"Somelari Samurai's Helmet",type:"Head",role:"DPS",style:"Kabuki",drops:"Gorilla Grodd"});
  armorCollection.push({name:"Spec-Ops Recon Helmet",type:"Head",role:"Healer",style:"Military Tech",drops:"Doctor Pyrate"});
  armorCollection.push({name:"Splendid Helmet of Might",type:"Head",role:"Healer",style:"Rapture",drops:"Pharaoh Vezina - Kahndaq"});
  armorCollection.push({name:"Star Helmet",type:"Head",role:"DPS",style:"Star Helmet",drops:"Evil Star"});
  armorCollection.push({name:"Steel Cap",type:"Head",role:"DPS",style:"Steel",drops:"Present in Vault"});
  armorCollection.push({name:"Streamlined Vinestalker Helmet",type:"Head",role:"DPS",style:"Antifreeze",drops:"Sequoia Lord"});
  armorCollection.push({name:"Sunstone Armet of Jurisdiction",type:"Head",role:"DPS",style:"Sunstone's Edge",drops:"T3 Terminal in Meta Wing"});
  armorCollection.push({name:"Superadvanced Gorillium Helmet",type:"Head",role:"DPS",style:"Insectoid",drops:""});
  armorCollection.push({name:"Synthium Combat Helmet",type:"Head",role:"DPS",style:"Angelic",drops:"Lunatic"});
  armorCollection.push({name:"Synthium-Hardened Deathmask",type:"Head",role:"DPS",style:"Retro Tech",drops:"Harley Quinn"});
  armorCollection.push({name:"Terrasect Armored Helmet",type:"Head",role:"Controller",style:"Aerial Defender",drops:"Prime Assassin"});
  armorCollection.push({name:"Tempter's Visage",type:"Head",role:"DPS",style:"Demonic",drops:"Possessed Raven Spirit - 8th Precinct Interior - Raven's Destiny"});
  armorCollection.push({name:"Tribal Wolfskin Hat",type:"Head",role:"Tank",style:"Shaman",drops:"Bat Family in Batcave: Outer Caverns Alert Alert"});
  armorCollection.push({name:"Twelfth-Level Thinking Helmet",type:"Head",role:"Controller",style:"Retro Tech",drops:"Subprime Regulator Alpha"});
  armorCollection.push({name:"Vat-Grown Beetlespur Helm",type:"Head",role:"DPS",style:"Biomech",drops:"Gorilla Grodd"});
  armorCollection.push({name:"Vengeance-Bound Helmet",type:"Head",role:"DPS",style:"Greco-Roman",drops:"Eclipso"});
  armorCollection.push({name:"Victor's Helmet",type:"Head",role:"Controller",style:"Winged Fury",drops:"Riot Control Prototype"});
  armorCollection.push({name:"Vined Medico Mask",type:"Head",role:"Healer",style:"Thorned Flexsuit",drops:"Abra Kadabra in Cosmic Treadmill: Flashback"});
  armorCollection.push({name:"War Helm of the Somelari Legion",type:"Head",role:"DPS",style:"Tech Ninja",drops:"Doomcrazed Citizen"});
  armorCollection.push({name:"Wayward Drone's Faceted Headguard",type:"Head",role:"DPS",style:"HIVE Defender",drops:"Queen Bee"});
  armorCollection.push({name:"Winged Neutronium Helmet",type:"Head",role:"DPS",style:"Raptor Tech",drops:"Zetta-Drone"});
  armorCollection.push({name:"Wit's End",type:"Head",role:"DPS",style:"Psycho",drops:"Poison Ivy"});
  armorCollection.push({name:"Zamaroni War Helmet",type:"Head",role:"DPS",style:"Jah Kir",drops:"Gorilla Grodd's Lab (Duo)"});
  armorCollection.push({name:"Helmet of Planar Vision",type:"Head",role:"DPS",style:"Astral Alloy",drops:"SubAvatar - South Gotham, Magic Avatar - T4 Themyscira: The Gates of Tartarus"});

  armorCollection.push({name:"Aberrant's Pack",type:"Back",role:"DPS",style:"Psycho",drops:"Prime Servitor"});
  armorCollection.push({name:"Advanced-Tech Utility Pack",type:"Back",role:"DPS",style:"Retro Tech",drops:"Robin"});
  armorCollection.push({name:"Aggressive Invader's Rearjets",type:"Back",role:"DPS",style:"Brainiac Invader",drops:"The Bailiff - South Gotham CourtHouse"});
  armorCollection.push({name:"Alien Threat Backguard",type:"Back",role:"DPS",style:"Jah Kir",drops:"Present in Vault"});
  armorCollection.push({name:"Alloyed Synthium Backguard",type:"Back",role:"DPS",style:"Contemporary Tech",drops:"Micro Security Bot"});
  armorCollection.push({name:"Amazonian Arbiter's Cape",type:"Back",role:"Controller",style:"Amazonian",drops:"T4 Themyscira: The Gates of Tartarus"});
  armorCollection.push({name:"Amazonian Hippocratic Cape",type:"Back",role:"Healer",style:"Amazonian",drops:"Brainiac Vanquisher - T4 Themyscira: The Gates of Tartarus"});
  armorCollection.push({name:"Amazonian Lancer's Cape",type:"Back",role:"DPS",style:"Amazonian",drops:"Brainiac Swarm Master - T4 Themyscira: The Gates of Tartarus"});
  armorCollection.push({name:"Backguard of the Desert Sun",type:"Back",role:"DPS",style:"Egyptian",drops:"Present in Vault"});
  armorCollection.push({name:"Battleworn Cloak of the Ancients",type:"Back",role:"DPS",style:"Druid",drops:"Worker - Hive Base DUO, Treasure Chest - Ferris Aircraft, Omac Base DUO"});
  armorCollection.push({name:"Batwoman's Serrated Cape",type:"Back",role:"DPS",style:"Batwoman",drops:"Bruno Mannheim"});
  armorCollection.push({name:"Blood Rock Cloak",type:"Back",role:"DPS",style:"Barbarian",drops:""});
  armorCollection.push({name:"Bracken Shroud",type:"Back",role:"Healer",style:"Snake",drops:"Vengeful Spirit"});
  armorCollection.push({name:"Brainiac's Back-Mounted Cannons",type:"Back",role:"DPS",style:"Brainiac",drops:"Brainiac"});
  armorCollection.push({name:"Burnished Bolovaxian Backguard",type:"Back",role:"DPS",style:"Shielded Robot",drops:"Present in Vault"});
  armorCollection.push({name:"Cape of the Faithful",type:"Back",role:"Healer",style:"Medieval",drops:"Brainiac Guardian MK-IV in Gotham Hospital T2 Duo"});
  armorCollection.push({name:"Cloak of Broken Dreams",type:"Back",role:"Healer",style:"Necromancer",drops:"Safe"});
  armorCollection.push({name:"Cloak of Lies",type:"Back",role:"DPS",style:"Greco-Roman",drops:"Circe"});
  armorCollection.push({name:"Cloak of Time",type:"Back",role:"DPS",style:"Necromancer",drops:"Safe"});
  armorCollection.push({name:"Commandant's Standard",type:"Back",role:"DPS",style:"Kabuki",drops:"Sinestro"});
  armorCollection.push({name:"Crystal-Thread Cape",type:"Back",role:"DPS",style:"New Genesis",drops:"Present in Vault"});
  armorCollection.push({name:"Deathgrin Combat Pack",type:"Back",role:"DPS",style:"Retro Tech",drops:"The Joker"});
  armorCollection.push({name:"Depleted Promethium Pack",type:"Back",role:"DPS",style:"Retro Tech",drops:"Deathstroke"});
  armorCollection.push({name:"Doomsday's Savage Spines",type:"Back",role:"DPS",style:"Doomsday",drops:"Doomsday"});
  armorCollection.push({name:"Embellished Spartan Cape",type:"Back",role:"DPS",style:"Greco-Roman",drops:"Bat Family in Batcave: Outer Caverns Alert Alert"});
  armorCollection.push({name:"Enchanted Back Pins",type:"Back",role:"DPS",style:"Voodoo",drops:""});
  armorCollection.push({name:"Energy Battery Backpack",type:"Back",role:"DPS",style:"Energy Battery",drops:"Krona"});
  armorCollection.push({name:"Enforcer's Bladed Back Armor",type:"Back",role:"DPS",style:"Oolong",drops:"Scorpionod MK-1 - Fortress of Solitude: The Chasm"});
  armorCollection.push({name:"Fearbringer Backguard",type:"Back",role:"DPS",style:"Shielded Robot",drops:"Sinestro"});
  armorCollection.push({name:"Foreman's Backplate",type:"Back",role:"Controller",style:"Antifreeze",drops:"Safe"});
  armorCollection.push({name:"Fortified Coluan Backplate",type:"Back",role:"Controller",style:"Alien Tech",drops:"Eradicator"});
  armorCollection.push({name:"Gleaming Thrusters",type:"Back",role:"Tank",style:"Sector Agent",drops:"Atrocitus"});
  armorCollection.push({name:"Gorilla Omen Backguard",type:"Back",role:"DPS",style:"Biomech",drops:"Present in Vault"});
  armorCollection.push({name:"Heavy Promethium Backguard",type:"Back",role:"Tank",style:"Heartshard",drops:"Riot Control Prototype"});
  armorCollection.push({name:"Hellforged Inertron Pack",type:"Back",role:"Controller",style:"Military Tech",drops:"Isis"});
  armorCollection.push({name:"Hellspawn Wings",type:"Back",role:"DPS",style:"",drops:"Present in Vault"});
  armorCollection.push({name:"Hero's Embellished Cape",type:"Back",role:"DPS",style:"Greco-Roman",drops:"Present in Vault"});
  armorCollection.push({name:"HIVE Stinger's Cloak",type:"Back",role:"DPS",style:"Jah Kir",drops:"Queen Bee"});
  armorCollection.push({name:"Irradiant Aeroplates",type:"Back",role:"DPS",style:"Sector Incendiary",drops:"The Lanterns"});
  armorCollection.push({name:"Jagged Legacy of Jax-Ur",type:"Back",role:"Tank",style:"Sunstone Bulwark",drops:"T3 Terminal"});
  armorCollection.push({name:"Kandorian Diagnostic Mantle",type:"Back",role:"Healer",style:"Sunstone Bulwark",drops:"T3 Terminal"});
  armorCollection.push({name:"Kryptonian Defense Mantle",type:"Back",role:"Healer",style:"Sunstone Bulwark",drops:"T3 Terminal"});
  armorCollection.push({name:"Lambent Thrusters",type:"Back",role:"Controller",style:"Sector Agent",drops:"Scion of Will"});
  armorCollection.push({name:"Large Mechanical Wings",type:"Back",role:"Tank",style:"Insectoid",drops:"OMAC"});
  armorCollection.push({name:"Light Biosculpted Backplate",type:"Back",role:"DPS",style:"Antifreeze",drops:"Ancient Bloodroot"});
  armorCollection.push({name:"Light Shinobi Backplate",type:"Back",role:"DPS",style:"Tech Ninja",drops:""});
  armorCollection.push({name:"Long Cape of the Round",type:"Back",role:"Controller",style:"Medieval",drops:"Lying Claw"});
  armorCollection.push({name:"Lucent Thrusters",type:"Back",role:"Healer",style:"Sector Agent",drops:"Evil Star"});
  armorCollection.push({name:"Magi's Mana-Focusing Adornment",type:"Back",role:"DPS",style:"Egyptian",drops:"Felix Faust"});
  armorCollection.push({name:"Manipulative Invader's Rearjets",type:"Back",role:"Controller",style:"Brainiac Invader",drops:"The Supreme Justice - South Gotham CourtHouse"});
  armorCollection.push({name:"Mantle of Command",type:"Back",role:"Controller",style:"Contemporary Tech",drops:"Penguin"});
  armorCollection.push({name:"Marramgrass Cloak",type:"Back",role:"Tank",style:"Remora",drops:"Kitefin"});
  armorCollection.push({name:"Master's Armored Wings",type:"Back",role:"Controller",style:"Winged Fury",drops:"Pharaoh Vezina - Kahndaq"});
  armorCollection.push({name:"Mechanized Evosynth Backplate",type:"Back",role:"DPS",style:"",drops:"Robot Batman"});
  armorCollection.push({name:"Mighty Achi Backplate",type:"Back",role:"DPS",style:"Mayan",drops:"Catwoman"});
  armorCollection.push({name:"Mighty Neutronium Wings",type:"Back",role:"DPS",style:"Raptor Tech",drops:"Brother Eye"});
  armorCollection.push({name:"Miniaturized Inertron Backplate",type:"Back",role:"Controller",style:"Winged Fury",drops:"Armored Robotic Custodian"});
  armorCollection.push({name:"Mister Freeze's Frigid Cryotank",type:"Back",role:"DPS",style:"Mister Freeze",drops:"Mister Freeze"});
  armorCollection.push({name:"Mister Freeze's Improved Cryotank",type:"Back",role:"DPS",style:"Mister Freeze",drops:"Mister Freeze"});
  armorCollection.push({name:"Monitor Propolusion Pack",type:"Back",role:"DPS",style:"",drops:"Present in Vault"});
  armorCollection.push({name:"Necrolord's Tattered Cloak",type:"Back",role:"DPS",style:"Necromancer",drops:""});
  armorCollection.push({name:"Nth-Metal Wings of the Council",type:"Back",role:"DPS",style:"Raptor Tech",drops:"Riot Control Prototype"});
  armorCollection.push({name:"Overclocked Inertron Pack",type:"Back",role:"Controller",style:"Military Tech",drops:"Bane in Cape Carmine Lighthouse DUO"});
  armorCollection.push({name:"Plated Assault Pack",type:"Back",role:"DPS",style:"Retro Tech",drops:"Harley Quinn"});
  armorCollection.push({name:"Powerful Promethium Backplate",type:"Back",role:"DPS",style:"Fourth World",drops:"Veteran"});
  armorCollection.push({name:"Premium Krypton-Tech Cloak",type:"Back",role:"DPS",style:"New Genesis",drops:"Doctor Psycho"});
  armorCollection.push({name:"Promethium-Thread Cape",type:"Back",role:"Tank",style:"Viking",drops:"Rogues"});
  armorCollection.push({name:"Protectorate Backguard",type:"Back",role:"DPS",style:"Shielded Robot",drops:"John Stewart"});
  armorCollection.push({name:"Prototype Palladium Backguard",type:"Back",role:"DPS",style:"Antifreeze",drops:"Present in Vault"});
  armorCollection.push({name:"Punchline's Sign",type:"Back",role:"DPS",style:"Kick Me",drops:"Punchline"});
  armorCollection.push({name:"Rao Panel Array",type:"Back",role:"Controller",style:"Kryptonian Commander",drops:"T3 Terminal in Meta Wing"});
  armorCollection.push({name:"Rapturous Wings of the Divine",type:"Back",role:"Healer",style:"Rapture",drops:"The Gatekeeper"});
  armorCollection.push({name:"Reinforced Invader's Rearjets",type:"Back",role:"Tank",style:"Brainiac Invader",drops:"The Attorneys - South Gotham CourtHouse"});
  armorCollection.push({name:"Restorative Invader's Rearjets",type:"Back",role:"Healer",style:"Brainiac Invader",drops:"The Bailiff - South Gotham CourtHouse"});
  armorCollection.push({name:"Riveted Coluan Backplate",type:"Back",role:"Tank",style:"Fourth World",drops:"Doomcrazed Citizen"});
  armorCollection.push({name:"Savage Backplate",type:"Back",role:"DPS",style:"Retro Tech",drops:"The Joker"});
  armorCollection.push({name:"Savage Back Pins",type:"Back",role:"DPS",style:"Voodoo",drops:""});
  armorCollection.push({name:"Scorpion Backplate",type:"Back",role:"DPS",style:"Tech Ninja",drops:""});
  armorCollection.push({name:"Serpentine Backguard",type:"Back",role:"DPS",style:"Tech Ninja",drops:"Brainiac Spark"});
  armorCollection.push({name:"Serpentine Cape",type:"Back",role:"DPS",style:"Snake",drops:"Minion of Wrath"});
  armorCollection.push({name:"Shards of the Lost Moon",type:"Back",role:"Tank",style:"Sunstone Bulwark",drops:"T3 Terminal"});
  armorCollection.push({name:"Shielded Capacitor Pack",type:"Back",role:"DPS",style:"Shielded Robot",drops:"Green Lantern"});
  armorCollection.push({name:"Shround of Zehuti",type:"Back",role:"DPS",style:"Egyptian",drops:"Isis"});
  armorCollection.push({name:"Sinister Biomesh Cape",type:"Back",role:"DPS",style:"Necromancer",drops:"Elite Servitor"});
  armorCollection.push({name:"Smoldering Pinions",type:"Back",role:"DPS",style:"Small Demonic Wings",drops:"Possessed Raven Spirit, Spirit of Raven - Science Police HQ (Challlenge)"});
  armorCollection.push({name:"Soothsayer's Tattered Cape",type:"Back",role:"Controller",style:"Shaman",drops:"Brainiac Guardian MK-XXII"});
  armorCollection.push({name:"Spec-Ops Utility Pack",type:"Back",role:"Healer",style:"Military Tech",drops:"Bat Family in Batcave: Outer Caverns Alert Alert"});
  armorCollection.push({name:"Specialized Combat Wings",type:"Back",role:"DPS",style:"Insectoid",drops:"Bludhaven Avenger"});
  armorCollection.push({name:"Specialized Plexiderm Backguard",type:"Back",role:"Tank",style:"Shielded Robot",drops:"Oolong Enforcer"});
  armorCollection.push({name:"Spiked Back Protector",type:"Back",role:"Tank",style:"Kryptonian",drops:"Sunstone Broodmother - Fortress of Solitude: The Chasm"});
  armorCollection.push({name:"Standard of the Divine Knight",type:"Back",role:"Tank",style:"Medieval",drops:"Clayface"});
  armorCollection.push({name:"Standard of the North Winds",type:"Back",role:"DPS",style:"Kabuki",drops:"Necro Magent Gruhn"});
  armorCollection.push({name:"Standard of the Round",type:"Back",role:"Controller",style:"Medieval",drops:"Lying Claw"});
  armorCollection.push({name:"Strange Jetpack",type:"Back",role:"DPS",style:"Joker Jetpack",drops:"Present in Vault"});
  armorCollection.push({name:"Sunstone Ward of Remand",type:"Back",role:"DPS",style:"Sunstone's Edge",drops:""});
  armorCollection.push({name:"Sunstone Ward of Sentencing",type:"Back",role:"DPS",style:"Sunstone's Edge",drops:""});
  armorCollection.push({name:"Synthweave Backplate",type:"Back",role:"DPS",style:"Split Personality",drops:"Penguin"});
  armorCollection.push({name:"Tactician's Backpack",type:"Back",role:"Tank",style:"Military Tech",drops:"Brainiac Guardian MK-III"});
  armorCollection.push({name:"Tech Ninja's Backplate",type:"Back",role:"DPS",style:"Tech Ninja",drops:""});
  armorCollection.push({name:"Tenebrous Cloak",type:"Back",role:"DPS",style:"Greco-Roman",drops:"Lightkeeper Janis"});
  armorCollection.push({name:"Terrasect Gliders",type:"Back",role:"Controller",style:"Aerial Defender",drops:"Scorpionod MK-1 - Fortress of Solitude: The Chasm"});
  armorCollection.push({name:"The Cape of Ra's al Ghul",type:"Back",role:"DPS",style:"Ra's al Ghul",drops:"Ra's al Ghul"});
  armorCollection.push({name:"Thorntwisted Cloak",type:"Back",role:"DPS",style:"Snake",drops:"Stryker Operator"});
  armorCollection.push({name:"Timeworn Manawoven Robe",type:"Back",role:"Healer",style:"Shaman",drops:"Zoom"});
  armorCollection.push({name:"Timeworn Slayer's Cloak",type:"Back",role:"Controller",style:"Druid",drops:"Minion of Wrath"});
  armorCollection.push({name:"Time Manipulator's Backplate",type:"Back",role:"DPS",style:"Jah Kir",drops:""});
  armorCollection.push({name:"Tribal Short Cape",type:"Back",role:"Tank",style:"Shaman",drops:"Chief Engineer Wolzie"});
  armorCollection.push({name:"Warden's Promethium Standard",type:"Back",role:"Tank",style:"Medieval",drops:"OMAC Delta"});
  armorCollection.push({name:"Wayfarer's Cloak",type:"Back",role:"DPS",style:"Remora",drops:"Soul Eater"});
  armorCollection.push({name:"Wayward Drone's Backplate",type:"Back",role:"DPS",style:"HIVE Defender",drops:"Queen Bee"});
  armorCollection.push({name:"Wendolskin Cloak",type:"Back",role:"DPS",style:"Barbarian",drops:""});
  armorCollection.push({name:"Whispering Crystal Cape",type:"Back",role:"DPS",style:"Necromancer",drops:"Killer Bee - Hive Base DUO, Prisoner - Cosmic Treadmill: Flashback"});
  armorCollection.push({name:"Wing Membrane Battleshroud",type:"Back",role:"DPS",style:"Biomech",drops:"Gorilla Grodd"});
  armorCollection.push({name:"Wings of the Council",type:"Back",role:"Healer",style:"Talon Lord",drops:"Scorpionod MK-1 - Fortress of Solitude: The Chasm"});
  armorCollection.push({name:"Wings of the Lifegiver",type:"Back",role:"Healer",style:"Rapture",drops:"Zetta-Drone"});
  armorCollection.push({name:"Cloak of the Astral Plane",type:"Back",role:"DPS",style:"Astral Alloy",drops:"Subavatar - South Gotham"});

  armorCollection.push({name:"Ancient Armored Chestguard",type:"Chest",role:"DPS",style:"",drops:"Present in Vault"});
  armorCollection.push({name:"Advanced Magno-Nuclear",type:"Chest",role:"DPS",style:"Retro Tech",drops:"Queen Bee"});
  armorCollection.push({name:"Aegis of El",type:"Chest",role:"Tank",style:"Sunstone Bulwark",drops:"T3 Terminal - Meta Wing"});
  armorCollection.push({name:"Aggressive Invader's Chestguard",type:"Chest",role:"DPS",style:"Brainiac Invader",drops:"The Supreme Justice - South Gotham Courthouse"});
  armorCollection.push({name:"Alloyed Synthium Shirt",type:"Chest",role:"DPS",style:"Contemporary Tech",drops:"Incorpator"});
  armorCollection.push({name:"Amalgamated Synthium Chestguard",type:"Chest",role:"DPS",style:"Retro Tech",drops:"Treasure Chest"});
  armorCollection.push({name:"Amazonian Hippocratic Breastplate",type:"Chest",role:"Healer",style:"Amazonian",drops:"Avatar of Magic - T4 Themyscira: The Gates of Tartarus"});
  armorCollection.push({name:"Amazonian Lancer's Breastplate",type:"Chest",role:"DPS",style:"Amazonian",drops:"Avatar of Magic - T4 Themyscira: The Gates of Tartarus"});
  armorCollection.push({name:"Amazonian Vanguard's Breastplate",type:"Chest",role:"Tank",style:"Amazonian",drops:"Avatar of Magic - T4 Themyscira: The Gates of Tartarus"});
  armorCollection.push({name:"Ancient Armored Chestguard",type:"Chest",role:"DPS",style:"Greco-Roman",drops:"Present in Vault"});
  armorCollection.push({name:"Archdruid's Shirt",type:"Chest",role:"DPS",style:"Druid",drops:"Drop"});
  armorCollection.push({name:"Armored Chestplate of Dominance",type:"Chest",role:"Controller",style:"Winged Fury",drops:"Bat Family"});
  armorCollection.push({name:"Authority of Zod",type:"Chest",role:"Tank",style:"Sunstone Bulwark",drops:"T3 Terminal"});
  armorCollection.push({name:"Avatar Infiltrator's Exoskeleton",type:"Chest",role:"DPS",style:"Avatar Infiltrator",drops:"Non, Ursa, & General Zod - Fortress of Solitude: Sunstone Matrix"});
  armorCollection.push({name:"Banded Champion Shirt",type:"Chest",role:"Tank",style:"Segmented Flexsuit",drops:"Pied Piper - Cosmic Treadmill: Flashback"});
  armorCollection.push({name:"Batman Hoodie",type:"Chest",role:"DPS",style:"Batman Hoodie",drops:"Present in Vault"});
  armorCollection.push({name:"Batwoman T-Shirt",type:"Chest",role:"DPS",style:"Batwoman T-Shirt",drops:"Present in Vault"});
  armorCollection.push({name:"Beachlord's Chestplate",type:"Chest",role:"DPS",style:"Remora",drops:"Drop"});
  armorCollection.push({name:"Beatific Chestplate",type:"Chest",role:"Healer",style:"Seraph",drops:"Villainy United"});
  armorCollection.push({name:"Bio-Adaptive Nanoweave Shirt",type:"Chest",role:"DPS",style:"Tech Ninja",drops:""});
  armorCollection.push({name:"Blessed Breastplate of Judgment",type:"Chest",role:"Healer",style:"Rapture",drops:"Black Adam"});
  armorCollection.push({name:"Bonecage of the Coercer",type:"Chest",role:"Controller",style:"Shaman",drops:"Brainiac Guardian MK-IV in Gotham Hospital T2 Duo"});
  armorCollection.push({name:"Captain Marvel T-Shirt",type:"Chest",role:"DPS",style:"Captain Marvel T-Shirt",drops:"Present in Vault"});
  armorCollection.push({name:"Chestguard of the Abyss",type:"Chest",role:"DPS",style:"Demonic",drops:"Present in Vault"});
  armorCollection.push({name:"Chestguard of the Deathless",type:"Chest",role:"DPS",style:"Insectoid",drops:"Chemo"});
  armorCollection.push({name:"Chestguard of the Undersea Kingdom",type:"Chest",role:"Controller",style:"Remora",drops:"Drop"});
  armorCollection.push({name:"Chestplate of Judgment",type:"Chest",role:"Healer",style:"Rapture",drops:"Armored Robotic Custodian"});
  armorCollection.push({name:"Chlorophyll Chestguard",type:"Chest",role:"DPS",style:"Snake",drops:""});
  armorCollection.push({name:"Clarion Chestplate of Courage",type:"Chest",role:"Tank",style:"Viking",drops:""});
  armorCollection.push({name:"Coluan Battleshirt",type:"Chest",role:"DPS",style:"Jah Kir",drops:"Present in Vault"});
  armorCollection.push({name:"Crystalline Reinforced Carapace",type:"Chest",role:"Tank",style:"Kryptonian",drops:"Prime Assassin"});
  armorCollection.push({name:"Cuirass of the Round",type:"Chest",role:"Controller",style:"Medieval",drops:"Bat Sentinels"});
  armorCollection.push({name:"Dauntless Dormorian Chestplate",type:"Chest",role:"Tank",style:"Heartshard",drops:"Brother Eye"});
  armorCollection.push({name:"Deadman Hoodie",type:"Chest",role:"DPS",style:"Deadman Hoodie",drops:"Present in Vault"});
  armorCollection.push({name:"Deathstroke's Menacing Bandolier",type:"Chest",role:"DPS",style:"Deathstroke",drops:"Deathstroke"});
  armorCollection.push({name:"Delirium's Starred Chestguard",type:"Chest",role:"DPS",style:"Psycho",drops:"Villainy United"});
  armorCollection.push({name:"Demonleather Chestguard",type:"Chest",role:"DPS",style:"Demonic",drops:"Possessed Raven Spirit - 8th Precinct Interior - Raven's Destiny"});
  armorCollection.push({name:"Dread Lord's Chestguard",type:"Chest",role:"DPS",style:"Necromancer",drops:"Drop"});
  armorCollection.push({name:"Dread Warlock's Robes",type:"Chest",role:"DPS",style:"Druid",drops:"Treasure Chest - Metropolis City Hall"});
  armorCollection.push({name:"Dominion of Zod",type:"Chest",role:"Controller",style:"Kryptonian Commander",drops:"T3 Terminal"});
  armorCollection.push({name:"Elemental Threat Shirt",type:"Chest",role:"DPS",style:"Contemporary Tech",drops:"Bruno Mannheim"});
  armorCollection.push({name:"Embellished H'lvenite Shirt",type:"Chest",role:"DPS",style:"Kabuki",drops:"Arkillo"});
  armorCollection.push({name:"Embellished Powersuit Shirt",type:"Chest",role:"DPS",style:"New Genesis",drops:"Present in Vault"});
  armorCollection.push({name:"Embroided Shirt of the Archdruid",type:"Chest",role:"DPS",style:"Druid",drops:"Hoplite Spearmaiden"});
  armorCollection.push({name:"Empowered Mesh Shirt",type:"Chest",role:"Controller",style:"Webbed Flexsuit",drops:"Pied Piper - Cosmic Treadmill: Flashback"});
  armorCollection.push({name:"Enameled Equilibrity Breastplate",type:"Chest",role:"Healer",style:"Rapture",drops:"Brainiac"});
  armorCollection.push({name:"Enchanted Loa Shirt",type:"Chest",role:"DPS",style:"Voodoo",drops:"Drop"});
  armorCollection.push({name:"Feathered Neutronium Breastplate",type:"Chest",role:"DPS",style:"Raptor Tech",drops:"Brother Eye"});
  armorCollection.push({name:"Flash T-Shirt",type:"Chest",role:"DPS",style:"Flash T-Shirt",drops:"Present in Vault"});
  armorCollection.push({name:"Galactic Guardian's Shirt",type:"Chest",role:"DPS",style:"Shielded Robot",drops:"Present in Vault"});
  armorCollection.push({name:"Gardner-style Vest",type:"Chest",role:"DPS",style:"Gardner-style",drops:"Guy Gardner"});
  armorCollection.push({name:"Gilded Spartan Cuirass",type:"Chest",role:"DPS",style:"Greco-Roman",drops:"Tornado Tyrant"});
  armorCollection.push({name:"Gleaming Panelled Chestguard",type:"Chest",role:"Tank",style:"Sector Agent",drops:"Parallax"});
  armorCollection.push({name:"Green Lantern Hoodie",type:"Chest",role:"DPS",style:"Green Lantern Hoodie",drops:"Present in Vault"});
  armorCollection.push({name:"Hawkman Hoodie",type:"Chest",role:"DPS",style:"Hawkman Hoodie",drops:"Present in Vault"});
  armorCollection.push({name:"Hellforged Exoskeletal Chestguard",type:"Chest",role:"DPS",style:"Demonic",drops:"The Titans - A Shadow of Hell"});
  armorCollection.push({name:"Fortuneteller's Nourishing Chestguard",type:"Chest",role:"Healer",style:"Necromancer",drops:"Safe"});
  armorCollection.push({name:"Enforcer's Promethium Chestplate",type:"Chest",role:"Tank",style:"Medieval",drops:"Bane Cape Carmine Lighthouse DUO"});
  armorCollection.push({name:"Imbued Mayan Breastplate",type:"Chest",role:"DPS",style:"Mayan",drops:"Catwoman"});
  armorCollection.push({name:"Imbued Spore Chestplate",type:"Chest",role:"DPS",style:"Antifreeze",drops:"Felix Faust"});
  armorCollection.push({name:"Inertron Chestplate of the Abyss",type:"Chest",role:"Controller",style:"Military Tech",drops:"Isis"});
  armorCollection.push({name:"Irradiant Padded Chestplate",type:"Chest",role:"DPS",style:"Sector Incendiary",drops:"Vice"});
  armorCollection.push({name:"Jackal's Shirt",type:"Chest",role:"DPS",style:"Egyptian",drops:"Present in Vault"});
  armorCollection.push({name:"Joker Hoodie",type:"Chest",role:"DPS",style:"Joker",drops:"Present in Vault"});
  armorCollection.push({name:"Korugarian Battlechest",type:"Chest",role:"DPS",style:"Barbarian",drops:"Splint in Cape Carmine Lighthouse DUO, Treasure Chest: Ferris Aircraft DUO, Gorilla Grodd's Lab DUO"});
  armorCollection.push({name:"Lambent Chestguard",type:"Chest",role:"Controller",style:"Sector Agent",drops:"Lyssa Drak"});
  armorCollection.push({name:"Laminated Gorillatech Shirt",type:"Chest",role:"DPS",style:"Biomech",drops:"Present in Vault"});
  armorCollection.push({name:"Laminated Inertron Chestplate",type:"Chest",role:"Controller",style:"Winged Fury",drops:"Brother Eye"});
  armorCollection.push({name:"Lobo Hoodie",type:"Chest",role:"DPS",style:"Lobo",drops:"Present in Vault"});
  armorCollection.push({name:"Lucent Padded Chestguard",type:"Chest",role:"Healer",style:"Sector Agent",drops:"Kyle Rayner"});
  armorCollection.push({name:"Lunar Warrior's Chestguard",type:"Chest",role:"DPS",style:"Tech Ninja",drops:"Guard Captain Bombus"});
  armorCollection.push({name:"LX-1500 Biomat Shirt",type:"Chest",role:"DPS",style:"New Genesis",drops:""});
  armorCollection.push({name:"Machined Domineer's Chestplate",type:"Chest",role:"Controller",style:"Contemporary Tech",drops:"Penguin"});
  armorCollection.push({name:"Manipulative Invader's Chestguard",type:"Chest",role:"Controller",style:"Brainiac Invader",drops:"The Supreme Justice - South Gotham CourtHouse"});
  armorCollection.push({name:"Martian Manhunter Hoodie",type:"Chest",role:"DPS",style:"Martian Manhunter Hoodie",drops:"Present in Vault"});
  armorCollection.push({name:"Master's Volcanic Chestguard",type:"Chest",role:"Controller",style:"Antifreeze",drops:"Doomfused Citizen in Smallville Alert"});
  armorCollection.push({name:"Mighty Coluan Chestplate",type:"Chest",role:"Tank",style:"Heartshard",drops:"Brainiac"});
  armorCollection.push({name:"Mutant Warrior's Harness",type:"Chest",role:"DPS",style:"Voodoo",drops:"Safe"});
  armorCollection.push({name:"Order of El",type:"Chest",role:"Controller",style:"Kryptonian Commander",drops:"T3 Terminal"});
  armorCollection.push({name:"Networked Nanobot Carapace",type:"Chest",role:"DPS",style:"Retro Tech",drops:""});
  armorCollection.push({name:"Parbati Ninja's Chestguard",type:"Chest",role:"DPS",style:"Tech Ninja",drops:"UGA Soldier"});
  armorCollection.push({name:"Peerless Simium Chestguard",type:"Chest",role:"DPS",style:"Insectoid",drops:"Drop"});
  armorCollection.push({name:"Praetorian Elite's Chestplate",type:"Chest",role:"DPS",style:"Greco-Roman",drops:""});
  armorCollection.push({name:"Promethium Chestplate of the Immortals",type:"Chest",role:"Tank",style:"Heartshard",drops:"Bat Family"});
  armorCollection.push({name:"Prophet's Radiant Chestguard",type:"Chest",role:"DPS",style:"Egyptian",drops:"Isis"});
  armorCollection.push({name:"Prophet's Shirt",type:"Chest",role:"DPS",style:"Egyptian",drops:"Treasure Chest"});
  armorCollection.push({name:"Prototype Veridium Chestguard",type:"Chest",role:"Controller",style:"Contemporary Tech",drops:""});
  armorCollection.push({name:"Rannian Zeta Chestguard",type:"Chest",role:"DPS",style:"Fourth World",drops:"Drop"});
  armorCollection.push({name:"Reinforced Chestguard of the G.I.",type:"Chest",role:"Tank",style:"Military Tech",drops:"Brainiac Guardian MK-XXII"});
  armorCollection.push({name:"Reinforced Invader's Chestguard",type:"Chest",role:"Tank",style:"Brainiac Invader",drops:"The Supreme Justice - South Gotham CourtHouse"});
  armorCollection.push({name:"Riddler T-Shirt",type:"Chest",role:"DPS",style:"Riddler T-Shirt",drops:"Present in Vault"});
  armorCollection.push({name:"Rimed Promethium Chestguard",type:"Chest",role:"Tank",style:"Medieval",drops:"Gorilla Grodd"});
  armorCollection.push({name:"Riveted Promethium Chestguard",type:"Chest",role:"Healer",style:"Retro Tech",drops:"Drop"});
  armorCollection.push({name:"Royal Guardian's Chestguard",type:"Chest",role:"DPS",style:"Jah Kir",drops:"Queen Bee"});
  armorCollection.push({name:"Scaled Chestpiece of the Assassin",type:"Chest",role:"DPS",style:"League of Assassins",drops:"Bolt Claw"});
  armorCollection.push({name:"Shirt of Ice",type:"Chest",role:"DPS",style:"Antifreeze",drops:"Present in Vault"});
  armorCollection.push({name:"Shirt of Searing Flames",type:"Chest",role:"DPS",style:"Kabuki",drops:"OMAC Delta"});
  armorCollection.push({name:"Sinestro Hoodie",type:"Chest",role:"DPS",style:"Sinestro Hoodie",drops:"Present in Vault"});
  armorCollection.push({name:"Slim Crystalline Shirt",type:"Chest",role:"DPS",style:"New Genesis",drops:"Doctor Psycho"});
  armorCollection.push({name:"Slimline Layered Shirt",type:"Chest",role:"DPS",style:"Paneled Bodysuit",drops:"Brainiac Guardian MK-XXII"});
  armorCollection.push({name:"Slimline Pointed Shirt",type:"Chest",role:"DPS",style:"Daggerpoint Bodysuit",drops:"Brainiac Guardian MK-III"});
  armorCollection.push({name:"Snake Lord's Shirt",type:"Chest",role:"DPS",style:"Snake",drops:"Drop"});
  armorCollection.push({name:"Somelari Shell",type:"Chest",role:"DPS",style:"Jah Kir",drops:"Treasure Chest"});
  armorCollection.push({name:"Spec-Ops Ballistic Vest",type:"Chest",role:"Healer",style:"Military Tech",drops:"Captain Buzzzcutt"});
  armorCollection.push({name:"Streamlined Assault Shirt",type:"Chest",role:"DPS",style:"Angled Flexsuit",drops:"Pied Piper - Cosmic Treadmill: Flashback"});
  armorCollection.push({name:"Summoner's Embellished Shirt",type:"Chest",role:"DPS",style:"Druid",drops:"Drop"});
  armorCollection.push({name:"Sunstone Conviction of El",type:"Chest",role:"DPS",style:"Sunstone's Edge",drops:"T3 Terminal"});
  armorCollection.push({name:"Sunstone Onslaught of Zod",type:"Chest",role:"DPS",style:"Sunstone's Edge",drops:"T3 Terminal"});
  armorCollection.push({name:"Superboy Hoodie",type:"Chest",role:"DPS",style:"Superboy Hoodie",drops:"Present in Vault"});
  armorCollection.push({name:"Superior Coluan Chestplate",type:"Chest",role:"Controller",style:"Alien Tech",drops:"Villainry United"});
  armorCollection.push({name:"Swiftweave Enforcer's Chestguard",type:"Chest",role:"DPS",style:"Oolong",drops:"Avatar of Meta"});
  armorCollection.push({name:"Terrasect-Enhanced Chestpiece",type:"Chest",role:"Controller",style:"Aerial Defender",drops:"Avatar of Meta"});
  armorCollection.push({name:"Themysciran Battlechest",type:"Chest",role:"DPS",style:"Greco-Roman",drops:"Wonder Woman"});
  armorCollection.push({name:"Tribalist's Manawoven Shirt",type:"Chest",role:"Healer",style:"Shaman",drops:"OMAC Delta"});
  armorCollection.push({name:"Tundralord's Harness",type:"Chest",role:"DPS",style:"Barbarian",drops:"Treasure Chest - Cosmic Treadmill: Flashback"});
  armorCollection.push({name:"Two-Face Hoodie",type:"Chest",role:"DPS",style:"Two-Face",drops:"Present in Vault"});
  armorCollection.push({name:"Vengeful Runed Chestguard",type:"Chest",role:"DPS",style:"Greco-Roman",drops:"Eclipso"});
  armorCollection.push({name:"Vestment of the Magician",type:"Chest",role:"DPS",style:"Abra Kadabra",drops:"Abra Kadabra in Cosmic Treadmill: Flashback"});
  armorCollection.push({name:"Vestments of the Science Council",type:"Chest",role:"Healer",style:"Talon Lord",drops:"Avatar of Meta"});
  armorCollection.push({name:"Vindication of Zod",type:"Chest",role:"Healer",style:"Kryptonian Medico",drops:"T3 Terminal"});
  armorCollection.push({name:"Vined Medico Shirt",type:"Chest",role:"Healer",style:"Thorned Flexsuit",drops:"Abra Kadabra in Cosmic Treadmill: Flashback"});
  armorCollection.push({name:"Virtue of El",type:"Chest",role:"Healer",style:"Kryptonian Medico",drops:"T3 Terminal"});
  armorCollection.push({name:"Warden's Covert Chestguard",type:"Chest",role:"DPS",style:"Tech Ninja",drops:"Treasure Chest"});
  armorCollection.push({name:"Wayfarer's Shirt",type:"Chest",role:"Tank",style:"Contemporary Tech",drops:"Lunatic"});
  armorCollection.push({name:"Wingman's Nth-Metal Chestplate",type:"Chest",role:"DPS",style:"Raptor Tech",drops:"Black Adam"});
  armorCollection.push({name:"Zoom T-Shirt",type:"Chest",role:"DPS",style:"Zoom T-Shirt",drops:"Present in Vault"});
  armorCollection.push({name:"Training Gi of the Martialist",type:"Chest",role:"DPS",style:"Kung- Fu Gi",drops:"SubAvatar - South Gotham"});
  armorCollection.push({name:"New Urban Formal Suit",type:"Chest",role:"DPS",style:"Urban Business",drops:"SubAvatar - South Gotham"});

  armorCollection.push({name:"Ace-Brand Chem-Proof Leggings",type:"Legs",role:"DPS",style:"Tech Ninja",drops:"Treasure Chest"});
  armorCollection.push({name:"Advanced Biomesh Leggings",type:"Legs",role:"DPS",style:"New Genesis",drops:"Power Girl"});
  armorCollection.push({name:"Advanced Synthweave Pants",type:"Legs",role:"DPS",style:"Split Personality",drops:"Penguin"});
  armorCollection.push({name:"Aggressive Invader's Legguards",type:"Legs",role:"DPS",style:"Brainiac Invader",drops:"The Attorneys South Gotham Courthouse"});
  armorCollection.push({name:"Alloyed Promethium Leggings",type:"Legs",role:"DPS",style:"Fourth World",drops:"Riot Officer"});
  armorCollection.push({name:"Alloyed Synthium Leggings",type:"Legs",role:"DPS",style:"Contemporary Tech",drops:"UGA Soldier"});
  armorCollection.push({name:"Amazonian Arbiter's Pteruges",type:"Legs",role:"Controller",style:"Amazonian",drops:"Avatar of Magic"});
  armorCollection.push({name:"Amazonian Hippocratic Pteruges",type:"Legs",role:"Healer",style:"Amazonian",drops:"Avatar of Magic"});
  armorCollection.push({name:"Amazonian Vanguard's Pteruges",type:"Legs",role:"Tank",style:"Amazonian",drops:"Drop"});
  armorCollection.push({name:"Ardent Paladin's Legplates",type:"Legs",role:"Healer",style:"Medieval",drops:"Brainiac Guardian MK-III"});
  armorCollection.push({name:"Armored Enforcer's Legplates",type:"Legs",role:"DPS",style:"Oolong",drops:"Corrupt Jor-El A.I."});
  armorCollection.push({name:"Asylum Guard's Leggings",type:"Legs",role:"DPS",style:"Retro Tech",drops:"Harley Quinn"});
  armorCollection.push({name:"Avatar Infiltrator's Legplates",type:"Legs",role:"DPS",style:"Avatar Infiltrator",drops:"Non, Ursa, & General Zod - Fortress of Solitude: Sunstone Matrix"});
  armorCollection.push({name:"Banded Champion Leggings",type:"Legs",role:"Tank",style:"Segmented Flexsuit",drops:"Abra Kadabra in Cosmic Treadmill: Flashback"});
  armorCollection.push({name:"Barbarous Leather Kilt",type:"Legs",role:"Tank",style:"Barbarian",drops:"Clayface"});
  armorCollection.push({name:"Batman Boxers",type:"Legs",role:"DPS",style:"Batman Boxers",drops:"Present in Vault"});
  armorCollection.push({name:"Berserker's Battlekilt",type:"Legs",role:"DPS",style:"Greco-Roman",drops:"Circe"});
  armorCollection.push({name:"Britches of the Manipulator",type:"Legs",role:"Controller",style:"Shaman",drops:"Brainiac Guardian MK-IV in Gotham Hospital T2 Duo"});
  armorCollection.push({name:"Carbon Nanotube Leggings",type:"Legs",role:"DPS",style:"Jah Kir",drops:"Subprime Regulator Beta"});
  armorCollection.push({name:"Cat Burglar's Leggings",type:"Legs",role:"DPS",style:"Cat Burglar",drops:"Catwoman"});
  armorCollection.push({name:"Crystalline Avenger's Legguards",type:"Legs",role:"DPS",style:"Voodoo",drops:"Drop"});
  armorCollection.push({name:"Cybernetic Interfaced Legguards",type:"Legs",role:"DPS",style:"Retro Tech",drops:"Prime Servitor"});
  armorCollection.push({name:"Defender's Crystal Greaves",type:"Legs",role:"Tank",style:"Kryptonian",drops:"Avatar of Meta"});
  armorCollection.push({name:"Defender's Plexiderm Leggings",type:"Legs",role:"Tank",style:"Fourth World",drops:"Treasure Chest"});
  armorCollection.push({name:"Delusion's Leggings",type:"Legs",role:"DPS",style:"Psycho",drops:"Mister Freeze"});
  armorCollection.push({name:"Desert Nomad's Kilt",type:"Legs",role:"DPS",style:"Necromancer",drops:"Treasure Chest"});
  armorCollection.push({name:"Divine Legplates of Power",type:"Legs",role:"Healer",style:"Rapture",drops:"Bat Family"});
  armorCollection.push({name:"Doomlord's Leggings",type:"Legs",role:"DPS",style:"Necromancer",drops:"Drop"});
  armorCollection.push({name:"Empowered Mesh Leggings",type:"Legs",role:"Controller",style:"Webbed Flexsuit",drops:"Abra Kadabra in Cosmic Treadmill: Flashback"});
  armorCollection.push({name:"Energized Terrasect Leg Guards",type:"Legs",role:"Controller",style:"Aerial Defender",drops:"Corrupt Jor-El A.I."});
  armorCollection.push({name:"Faceted Sunstone Legguards",type:"Legs",role:"Healer",style:"Kryptonian Medico",drops:"T3 Terminal"});
  armorCollection.push({name:"Flash Boxers",type:"Legs",role:"DPS",style:"Flash Boxers",drops:"Present in Vault"});
  armorCollection.push({name:"Foreman's Veridium Legplates",type:"Legs",role:"Controller",style:"Antifreeze",drops:"Smallville Alert"});
  armorCollection.push({name:"Furious Coluan Leggings",type:"Legs",role:"Controller",style:"Alien Tech",drops:"Mister Freeze"});
  armorCollection.push({name:"Galactic Guardian's Leggings",type:"Legs",role:"DPS",style:"Shielded Robot",drops:"Present in Vault"});
  armorCollection.push({name:"Gleaming Legpanelling",type:"Legs",role:"Tank",style:"Sector Agent",drops:"Krona"});
  armorCollection.push({name:"Greaves of Edict",type:"Legs",role:"Tank",style:"Sunstone Bulwark",drops:"T3 Terminal"});
  armorCollection.push({name:"Greaves of Noble Stone",type:"Legs",role:"Tank",style:"Sunstone Bulwark",drops:"T3 Terminal"});
  armorCollection.push({name:"Hardened Evosynth Legguards",type:"Legs",role:"DPS",style:"Fourth World",drops:"Treasure Chest"});
  armorCollection.push({name:"Horned Beetle Legguards",type:"Legs",role:"DPS",style:"Insectoid",drops:"Royal Drone"});
  armorCollection.push({name:"Imbued Mayan Leggings",type:"Legs",role:"DPS",style:"Mayan",drops:"Catwoman"});
  armorCollection.push({name:"Imbued Spore Legplates",type:"Legs",role:"DPS",style:"Antifreeze",drops:"Felix Faust"});
  armorCollection.push({name:"Insulated Manawoven Kilt",type:"Legs",role:"Healer",style:"Shaman",drops:"Zoom"});
  armorCollection.push({name:"Interdimensional Legpanelling",type:"Legs",role:"Controller",style:"Kryptonian Commander",drops:"T3 Terminal in Meta Wing"});
  armorCollection.push({name:"Irradiant Legpanelling",type:"Legs",role:"DPS",style:"Sector Incendiary",drops:"Evil Star"});
  armorCollection.push({name:"Kilt of the Imposter",type:"Legs",role:"DPS",style:"Greco-Roman",drops:"Circe"});
  armorCollection.push({name:"Kilt of the Stag Lord",type:"Legs",role:"DPS",style:"Druid",drops:"Soulless Shell"});
  armorCollection.push({name:"Kilt of Vengeance",type:"Legs",role:"DPS",style:"Kabuki",drops:"OMAC Sigma"});
  armorCollection.push({name:"Lambent Legpanelling",type:"Legs",role:"Controller",style:"Sector Agent",drops:"Atrocitus"});
  armorCollection.push({name:"Laminated Valorium Leggings",type:"Legs",role:"Controller",style:"Winged Fury",drops:"OMAC Batman"});
  armorCollection.push({name:"Leggings of the Loa",type:"Legs",role:"DPS",style:"Voodoo",drops:"Drop"});
  armorCollection.push({name:"Legguards of the Demon Host",type:"Legs",role:"DPS",style:"Demonic",drops:"Present in Vault"});
  armorCollection.push({name:"Legwraps of Methu",type:"Legs",role:"DPS",style:"Egyptian",drops:"Drop"});
  armorCollection.push({name:"Legplates of Free Thought",type:"Legs",role:"DPS",style:"Shielded Robot",drops:"John Stewart"});
  armorCollection.push({name:"Legplates of the Round",type:"Legs",role:"Controller",style:"Medieval",drops:"Chief Engineer Wolzie"});
  armorCollection.push({name:"Legplates of Thera",type:"Legs",role:"Tank",style:"Viking",drops:"Scarecrow"});
  armorCollection.push({name:"Legplates of Animosity",type:"Legs",role:"Controller",style:"Winged Fury",drops:"Black Adam"});
  armorCollection.push({name:"Light Neutronium Leggings",type:"Legs",role:"DPS",style:"Raptor Tech",drops:"Brother Eye"});
  armorCollection.push({name:"Lucent Legpanelling",type:"Legs",role:"Healer",style:"Sector Agent",drops:"Scion of Will"});
  armorCollection.push({name:"Manipulative Invader's Legguards",type:"Legs",role:"Controller",style:"Brainiac Invader",drops:"The Bailiff - South Gotham CourtHouse"});
  armorCollection.push({name:"Padded Spec-Ops Pants",type:"Legs",role:"Healer",style:"Military Tech",drops:"Riot Control Prototype"});
  armorCollection.push({name:"Plainswalker's Kilt",type:"Legs",role:"DPS",style:"Barbarian",drops:"Drop"});
  armorCollection.push({name:"Plated Greaves of the Council",type:"Legs",role:"Healer",style:"Talon Lord",drops:"Prime Assassin"});
  armorCollection.push({name:"Plated Sunstone Greaves",type:"Legs",role:"Healer",style:"Kryptonian Medico",drops:"T3 Terminal"});
  armorCollection.push({name:"Powersuit Tights",type:"Legs",role:"DPS",style:"New Genesis",drops:"Present in Vault"});
  armorCollection.push({name:"Primal Metamorphosis Legguards",type:"Legs",role:"DPS",style:"Insectoid",drops:"Bludhaven Avenger"});
  armorCollection.push({name:"Promethium Legguards of Shiruta",type:"Legs",role:"Tank",style:"Medieval",drops:"Isis"});
  armorCollection.push({name:"Pyramid Leggings",type:"Legs",role:"DPS",style:"",drops:"Present in Vault"});
  armorCollection.push({name:"Regenerative Leggings",type:"Legs",role:"Healer",style:"Snake",drops:"Treasure Chest"});
  armorCollection.push({name:"Restorative Invader's Legguards",type:"Legs",role:"Healer",style:"Brainiac Invader",drops:"The Supreme Justice - South Gotham CourtHouse"});
  armorCollection.push({name:"Royal Inertron Legguards",type:"Legs",role:"Controller",style:"Military Tech",drops:"Isis"});
  armorCollection.push({name:"Rune-Etched Kilt",type:"Legs",role:"DPS",style:"Greco-Roman",drops:"Drop"});
  armorCollection.push({name:"Scaled Manaflow Leggings",type:"Legs",role:"Healer",style:"Rapture",drops:"Brainiac"});
  armorCollection.push({name:"Slimline Layered Leggings",type:"Legs",role:"DPS",style:"Paneled Bodysuit",drops:"Brainiac Guardian MK-III"});
  armorCollection.push({name:"Slimline Pointed Leggings",type:"Legs",role:"DPS",style:"Paneled Bodysuit",drops:"Brainiac Guardian MK-IV in Gotham Hospital T2 Duo"});
  armorCollection.push({name:"Shimmering Sunstone Legguards",type:"Legs",role:"DPS",style:"Snake",drops:"Drop Ace Chemicals, Area 51 Alert, Arkham Asylum"});
  armorCollection.push({name:"Spellwoven Pharonic Leggings",type:"Legs",role:"DPS",style:"Egyptian",drops:"Felix Faust"});
  armorCollection.push({name:"Starseeker's Legguards",type:"Legs",role:"DPS",style:"",drops:"Present in Vault"});
  armorCollection.push({name:"Stonethrower's Kilt",type:"Legs",role:"Healer",style:"Shaman",drops:"Killer Croc & Deathstroke - Cape Carmine Lighthouse DUO"});
  armorCollection.push({name:"Streamlined Assault Leggings",type:"Legs",role:"DPS",style:"Angled Flexsuit",drops:"Pied Piper - Cosmic Treadmill: Flashback"});
  armorCollection.push({name:"Studded Kilt of Maiming",type:"Legs",role:"DPS",style:"Greco-Roman",drops:"Penguin"});
  armorCollection.push({name:"Sensei's Leggings",type:"Legs",role:"DPS",style:"Tech Ninja",drops:"UGA Soldier"});
  armorCollection.push({name:"Shadowcrest Kilt",type:"Legs",role:"DPS",style:"Druid",drops:"Drop"});
  armorCollection.push({name:"Slim Gorillatech Legguards",type:"Legs",role:"DPS",style:"Biomech",drops:"Present in Vault"});
  armorCollection.push({name:"Sniper's Quickstep Pants",type:"Legs",role:"DPS",style:"Remora",drops:"Drop"});
  armorCollection.push({name:"Spined Dragon Legguards",type:"Legs",role:"DPS",style:"Necromancer",drops:"Bloodroot Sapling - The Greenhouse Challenge, Prisoner - Cosmic Treadmill: Flashback, Security Drone - Batcave: Outer Caverns, Security Sentry - Batcave: Outer Caverns, Tiger Eye - Gotham University Warehouse, Wing Armor - Batcave: Outer Caverns"});
  armorCollection.push({name:"Sunstone Greaves of Assault",type:"Legs",role:"DPS",style:"Sunstone's Edge",drops:"T3 Terminal"});
  armorCollection.push({name:"Sunstone Legplates of Judgment",type:"Legs",role:"DPS",style:"Sunstone's Edge",drops:"T3 Terminal"});
  armorCollection.push({name:"Synthium-Studded Kilt",type:"Legs",role:"DPS",style:"Greco-Roman",drops:"Present in Vault"});
  armorCollection.push({name:"Tactical Legguards of the G.I.",type:"Legs",role:"Tank",style:"Military Tech",drops:"Brainiac Guardian MK-XXII"});
  armorCollection.push({name:"Terrormaster's Legguards",type:"Legs",role:"DPS",style:"Scarecrow",drops:"Scarecrow"});
  armorCollection.push({name:"Thasallan Nth-Metal Legplates",type:"Legs",role:"DPS",style:"Raptor Tech",drops:"Bat Sentinels"});
  armorCollection.push({name:"Threefold Legplates",type:"Legs",role:"Healer",style:"Seraph",drops:"Poison Ivy"});
  armorCollection.push({name:"Tribal Buckskin Leggings",type:"Legs",role:"Tank",style:"Shaman",drops:"Burning Claw"});
  armorCollection.push({name:"Tundralord's Kilt",type:"Legs",role:"DPS",style:"Barbarian",drops:"Drop"});
  armorCollection.push({name:"Tyrant's Leggings",type:"Legs",role:"DPS",style:"Antifreeze",drops:"Present in Vault"});
  armorCollection.push({name:"Vengeance-Bound Kilt",type:"Legs",role:"DPS",style:"Greco-Roman",drops:"Eclipso"});
  armorCollection.push({name:"Vined Medico Leggings",type:"Legs",role:"Healer",style:"Thorned Flexsuit",drops:"Pied Piper - Cosmic Treadmill: Flashback"});
  armorCollection.push({name:"Warrior's Promethium Legguards",type:"Legs",role:"Tank",style:"Heartshard",drops:"Black Adam"});
  armorCollection.push({name:"Willborn Leggings",type:"Legs",role:"DPS",style:"Jah Kir",drops:"Treasure Chest"});
  armorCollection.push({name:"Legplates of Planar Change",type:"Legs",role:"DPS",style:"Astral Alloy",drops:"Subavatar - South Gotham"});

  armorCollection.push({name:"Abyssal Lord's Shoulders",type:"Shoulders",role:"DPS",style:"Kabuki",drops:"OMAC Delta"});
  armorCollection.push({name:"Aggressive Invader's Shoulderguards",type:"Shoulders",role:"DPS",style:"Brainiac Invader",drops:"The Supreme Justice - South Gotham CourtHouse"});
  armorCollection.push({name:"All-Seer's Promethium Shoulderguards",type:"Shoulders",role:"Tank",style:"Medieval",drops:"Queen Bee"});
  armorCollection.push({name:"Amazonian Arbiter's Pauldrons",type:"Shoulders",role:"Controller",style:"Amazonian",drops:"Brainiac Swarm Master - T4 Themyscira: The Gates of Tartarus"});
  armorCollection.push({name:"Amazonian Hippocratic Pauldrons",type:"Shoulders",role:"Healer",style:"Amazonian",drops:"Brainiac Vanquisher - T4 Themyscira: The Gates of Tartarus"});
  armorCollection.push({name:"Amazonian Lancer's Pauldrons",type:"Shoulders",role:"DPS",style:"Amazonian",drops:"Brainiac Vanquisher - T4 Themyscira: The Gates of Tartarus"});
  armorCollection.push({name:"Amazonian Vanguard's Pauldrons",type:"Shoulders",role:"Tank",style:"Amazonian",drops:"Brainiac Swarm Master - T4 Themyscira: The Gates of Tartarus"});
  armorCollection.push({name:"Ancient Kandorian Warguards",type:"Shoulders",role:"DPS",style:"New Genesis",drops:"Drop"});
  armorCollection.push({name:"Anodized Nth-Metal Shoulderplates",type:"Shoulders",role:"DPS",style:"Contemporary Tech",drops:"Drop"});
  armorCollection.push({name:"Antagonist's Coluan Shoulders",type:"Shoulders",role:"Controller",style:"Alien Tech",drops:"Scarecrow"});
  armorCollection.push({name:"Archdruid's All-Powerful Pauldrons",type:"Shoulders",role:"Controller",style:"Druid",drops:"Drop"});
  armorCollection.push({name:"Assassin's Scale Shoulderguards",type:"Shoulders",role:"DPS",style:"League of Assassins",drops:"Lying Claw"});
  armorCollection.push({name:"Avatar Infiltrator's Shoulderplates",type:"Shoulders",role:"DPS",style:"Avatar Infiltrator",drops:"Avatar of Meta"});
  armorCollection.push({name:"Barbed Shoulderguards of the Enforcer",type:"Shoulders",role:"DPS",style:"Biker",drops:"Bane in Cape Carmine Lighthouse mission"});
  armorCollection.push({name:"Bioshaped Gorillium Shoulderguards",type:"Shoulders",role:"DPS",style:"Biomech",drops:"Gorilla Grodd"});
  armorCollection.push({name:"Bioshaped Warlord's Shoulders",type:"Shoulders",role:"DPS",style:"Voodoo",drops:"Treasure Chest"});
  armorCollection.push({name:"Clawed Tribal Shoulderguards",type:"Shoulders",role:"Tank",style:"Shaman",drops:"Doctor Pyrate"});
  armorCollection.push({name:"Commando's Shoulderplates",type:"Shoulders",role:"Tank",style:"Military Tech",drops:"Brainiac Guardian MK-IV in Gotham Hospital T2 Duo"});
  armorCollection.push({name:"Crenellated Promethium Spaulders",type:"Shoulders",role:"Tank",style:"Medieval",drops:"Sinestro"});
  armorCollection.push({name:"Crystal Pauldrons of Defense",type:"Shoulders",role:"Tank",style:"Sunstone Bulwark",drops:"T3 Terminal"});
  armorCollection.push({name:"Crystal Pauldrons of Offense",type:"Shoulders",role:"Tank",style:"Sunstone Bulwark",drops:"T3 Terminal"});
  armorCollection.push({name:"Crystalline Armguards",type:"Shoulders",role:"Healer",style:"Kryptonian Medico",drops:"T3 Terminal"});
  armorCollection.push({name:"Crystalline Avenger's Spaulders",type:"Shoulders",role:"DPS",style:"Necromancer",drops:"Drop"});
  armorCollection.push({name:"Crystalline Shoulderplates",type:"Shoulders",role:"Healer",style:"Kryptonian Medico",drops:"T3 Terminal"});
  armorCollection.push({name:"Crystalline Shoulders of Strength",type:"Shoulders",role:"Tank",style:"Viking",drops:"Poison Ivy"});
  armorCollection.push({name:"Crystalline Stalagmite Shoulderguards",type:"Shoulders",role:"Tank",style:"Kryptonian",drops:"Sunstone Domineer - Fortress of Solitude: The Chasm"});
  armorCollection.push({name:"Defender's Korllium Shoulderguards",type:"Shoulders",role:"Tank",style:"Fourth World",drops:"Treasure Chest"});
  armorCollection.push({name:"Elite Gorillatech Shoulderguards",type:"Shoulders",role:"DPS",style:"Biomech",drops:"Ultra-Humanite"});
  armorCollection.push({name:"Enforcer's Shoulderplates",type:"Shoulders",role:"DPS",style:"Jah Kir",drops:"Drop"});
  armorCollection.push({name:"Enforcer's Spiked Shoulderguards",type:"Shoulders",role:"DPS",style:"Oolong",drops:"Sunstone Broodmother - Fortress of Solitude: The Chasm"});
  armorCollection.push({name:"Enhanced ServitorTech Shoulderguards",type:"Shoulders",role:"DPS",style:"Retro Tech",drops:"Brainiac Joker-bot"});
  armorCollection.push({name:"Eternal Herald's Shoulderguards",type:"Shoulders",role:"DPS",style:"Egyptian",drops:"Isis"});
  armorCollection.push({name:"Future Shinobi Spaulders",type:"Shoulders",role:"DPS",style:"Tech Ninja",drops:"Drop"});
  armorCollection.push({name:"Galactic Battle Shoulders",type:"Shoulders",role:"DPS",style:"Jah Kir",drops:"Present in Vault"});
  armorCollection.push({name:"Gladiator's Spaulders",type:"Shoulders",role:"DPS",style:"Barbarian",drops:"Soulless Shell"});
  armorCollection.push({name:"Gleaming Shoulderguards",type:"Shoulders",role:"Tank",style:"Sector Agent",drops:"Evil Star"});
  armorCollection.push({name:"Hallowed Shoulderguards of Prophecy",type:"Shoulders",role:"Healer",style:"Rapture",drops:"General Adnan"});
  armorCollection.push({name:"Hardened Inertron Shoulderguards",type:"Shoulders",role:"Controller",style:"Military Tech",drops:"Killer Croc & Deathstroke - Cape Carmine Lighthouse DUO"});
  armorCollection.push({name:"Honored H'levenite Shoulderguards",type:"Shoulders",role:"DPS",style:"Shielded Robot",drops:"Present in Vault"});
  armorCollection.push({name:"Inlaid Powerwork Shoulderguards",type:"Shoulders",role:"DPS",style:"Snake",drops:"Treasure Chest"});
  armorCollection.push({name:"Innovative Synthium-Plated Shoulderguards",type:"Shoulders",role:"DPS",style:"Biomech",drops:"Treasure Chest"});
  armorCollection.push({name:"Irradiant Plated Shoulderguards",type:"Shoulders",role:"DPS",style:"Sector Incendiary",drops:"Scion of Will"});
  armorCollection.push({name:"Lambent Shoulderguards",type:"Shoulders",role:"Controller",style:"Sector Agent",drops:"The Lanterns"});
  armorCollection.push({name:"Laminated Evosynth Shoulderguards",type:"Shoulders",role:"DPS",style:"Fourth World",drops:"Drop"});
  armorCollection.push({name:"Light Kandorian Shoulders",type:"Shoulders",role:"DPS",style:"",drops:"Present in Vault"});
  armorCollection.push({name:"Lucent Shoulderguards",type:"Shoulders",role:"Healer",style:"Sector Agent",drops:"Scion of Fear - Star Labs Alert"});
  armorCollection.push({name:"Magi's Nanoweave Shoulders",type:"Shoulders",role:"Healer",style:"Snake",drops:"Treasure Chest"});
  armorCollection.push({name:"Managem Shoulderguards",type:"Shoulders",role:"DPS",style:"Greco-Roman",drops:"Giganta"});
  armorCollection.push({name:"Manipulative Invader's Shoulderguards",type:"Shoulders",role:"Controller",style:"Brainiac Invader",drops:"The Bailiff - South Gotham CourtHouse"});
  armorCollection.push({name:"Master's CobraTech Shoulderguards",type:"Shoulders",role:"Controller",style:"Antifreeze",drops:"Treasure Chest"});
  armorCollection.push({name:"Merciless Valorium Shoulderguards",type:"Shoulders",role:"Healer",style:"Rapture",drops:"Brother Eye"});
  armorCollection.push({name:"Mighty Promethium Shoulderplates",type:"Shoulders",role:"Tank",style:"Heartshard",drops:"Brother Eye"});
  armorCollection.push({name:"Necrolord's Enchanted Shoulderguards",type:"Shoulders",role:"DPS",style:"Necromancer",drops:"Drop"});
  armorCollection.push({name:"Neomagnetic Shoulderguards",type:"Shoulders",role:"DPS",style:"Antifreeze",drops:"Present in Vault"});
  armorCollection.push({name:"Nth-Metal Shoulders of Enndupar",type:"Shoulders",role:"DPS",style:"Raptor Tech",drops:"Black Adam"});
  armorCollection.push({name:"Orichalcum Mantle",type:"Shoulders",role:"DPS",style:"Demonic",drops:"Felix Faust - Mannheim's Chinese Theater"});
  armorCollection.push({name:"Paramount Promethium Shoulderguards",type:"Shoulders",role:"Tank",style:"Heartshard",drops:"The Gatekeeper"});
  armorCollection.push({name:"Pauldrons of the Ardent Paladin",type:"Shoulders",role:"Healer",style:"Medieval",drops:"Brainiac Guardian MK-XXII"});
  armorCollection.push({name:"Plated Kandorian Spaulder",type:"Shoulders",role:"Controller",style:"Kryptonian Commander",drops:"T3 Terminal"});
  armorCollection.push({name:"Plated Phantom Spaulder",type:"Shoulders",role:"Controller",style:"Kryptonian Commander",drops:"T3 Terminal"});
  armorCollection.push({name:"Pollenized Inertron Shoulderguards",type:"Shoulders",role:"Controller",style:"Military Tech",drops:"Necro Magent Gruhn"});
  armorCollection.push({name:"Prisoner's Manawoven Shoulders",type:"Shoulders",role:"Healer",style:"Shaman",drops:"Drop"});
  armorCollection.push({name:"Ranked Epaulets of the Council",type:"Shoulders",role:"Healer",style:"Talon Lord",drops:"Sunstone Domineer - Fortress of Solitude: The Chasm"});
  armorCollection.push({name:"Reinforced Coluan Spaulders",type:"Shoulders",role:"DPS",style:"Jah Kir",drops:"Drop"});
  armorCollection.push({name:"Reinforced Invader's Shoulderguards",type:"Shoulders",role:"Tank",style:"Brainiac Invader",drops:"The Supreme Justice - South Gotham CourtHouse"});
  armorCollection.push({name:"Reinforced Terrasect Pauldrons",type:"Shoulders",role:"Controller",style:"Aerial Defender",drops:"Sunstone Domineer - Fortress of Solitude: The Chasm"});
  armorCollection.push({name:"Riveted Shoulderplates",type:"Shoulders",role:"DPS",style:"Fourth World",drops:"Drop"});
  armorCollection.push({name:"Runed Aeaean Shoulderguards",type:"Shoulders",role:"DPS",style:"Greco-Roman",drops:"Circe"});
  armorCollection.push({name:"Sea Lord's Shoulders",type:"Shoulders",role:"Controller",style:"Remora",drops:"Drop"});
  armorCollection.push({name:"Sector 13 Shoulderpads",type:"Shoulders",role:"DPS",style:"Sector 13",drops:"Vice"});
  armorCollection.push({name:"Shining Shoulderguards",type:"Shoulders",role:"Healer",style:"Seraph",drops:"Mister Freeze"});
  armorCollection.push({name:"Shinobi Tech Shoulderguards",type:"Shoulders",role:"DPS",style:"Tech Ninja",drops:"Drop"});
  armorCollection.push({name:"Shoulderguards of Eternal Life",type:"Shoulders",role:"DPS",style:"Snake",drops:"Brainiac Spark"});
  armorCollection.push({name:"Shoulderguards of the Divine",type:"Shoulders",role:"DPS",style:"Angelic",drops:"Sandtiger"});
  armorCollection.push({name:"Shoulderguards of the Minotaur Slayer",type:"Shoulders",role:"DPS",style:"Greco-Roman",drops:"Minotaur"});
  armorCollection.push({name:"Shoulders of Domination",type:"Shoulders",role:"Controller",style:"Winged Fury",drops:"Zetta-Drone"});
  armorCollection.push({name:"Shoulders of Itzli",type:"Shoulders",role:"DPS",style:"Kabuki",drops:"Bane - Cape Carmine Lighthouse DUO"});
  armorCollection.push({name:"Shoulders of the Colossus",type:"Shoulders",role:"DPS",style:"Greco-Roman",drops:"Enchanted Colossus"});
  armorCollection.push({name:"Shoulders of Wrath",type:"Shoulders",role:"Controller",style:"Winged Fury",drops:"Bat Sentinels"});
  armorCollection.push({name:"Simium-Sheathed Shoulderguards",type:"Shoulders",role:"DPS",style:"Biomech",drops:"Present in Vault"});
  armorCollection.push({name:"Skartaris Shoulderguards",type:"Shoulders",role:"Tank",style:"Barbarian",drops:"Sandtiger"});
  armorCollection.push({name:"Soulbond Shoulderplates",type:"Shoulders",role:"DPS",style:"Demonic",drops:"Possessed Raven Spirit - 8th Precinct Interior - Raven's Destiny"});
  armorCollection.push({name:"Spec-Ops Ceramic Shoulderplates",type:"Shoulders",role:"Healer",style:"Military Tech",drops:"Bat Sentinels"});
  armorCollection.push({name:"Spiked Pauldrons of the Round",type:"Shoulders",role:"Controller",style:"Medieval",drops:"Captain Buzzzcutt"});
  armorCollection.push({name:"Spiked Synthium Shoulderguards",type:"Shoulders",role:"DPS",style:"",drops:"Present in Vault"});
  armorCollection.push({name:"Spined Chitin Shoulderguards",type:"Shoulders",role:"DPS",style:"Insectoid",drops:"Magnetar-SL"});
  armorCollection.push({name:"Splined Cenote Shoulders",type:"Shoulders",role:"DPS",style:"Mayan",drops:"Catwoman"});
  armorCollection.push({name:"Studded Warrior's Spaulders",type:"Shoulders",role:"Tank",style:"Barbarian",drops:"Penguin"});
  armorCollection.push({name:"Sturdy Nanoplated Shoulders",type:"Shoulders",role:"DPS",style:"Biomech",drops:"Treasure Chest in Oolong Alert"});
  armorCollection.push({name:"Sulphuric Shoulderplates",type:"Shoulders",role:"DPS",style:"Demonic",drops:"Present in Vault"});
  armorCollection.push({name:"Sunstone Shards of Incursion",type:"Shoulders",role:"DPS",style:"Sunstone's Edge",drops:"T3 Terminal"});
  armorCollection.push({name:"Sunstone Shards of Verdict",type:"Shoulders",role:"DPS",style:"Sunstone's Edge",drops:"T3 Terminal"});
  armorCollection.push({name:"Sunstone Shoulderguards",type:"Shoulders",role:"DPS",style:"",drops:"Present in Vault"});
  armorCollection.push({name:"Tactical Reassembly Shoulderguards",type:"Shoulders",role:"DPS",style:"Robotic",drops:"Chang Tzu"});
  armorCollection.push({name:"Tactical Synthweave Shoulders",type:"Shoulders",role:"DPS",style:"Split Personality",drops:"Penguin"});
  armorCollection.push({name:"Thorny Shoulderguards",type:"Shoulders",role:"DPS",style:"Snake",drops:"Treasure Chest"});
  armorCollection.push({name:"Tribal Shoulderguards of the Warlock",type:"Shoulders",role:"Controller",style:"Shaman",drops:"Brainiac Guardian MK-III"});
  armorCollection.push({name:"Vengeful Runed Shoulderguards",type:"Shoulders",role:"DPS",style:"Greco-Roman",drops:"Eclipso"});
  armorCollection.push({name:"Winged Nth-Metal Shoulderguards",type:"Shoulders",role:"DPS",style:"Raptor Tech",drops:"OMAC Batman"});
  armorCollection.push({name:"Witch Doctor's Shoulders",type:"Shoulders",role:"DPS",style:"Voodoo",drops:"Juicer - Cape Carmine Lighthouse DUO, Lexcorp Scientist - Smallville, Omega Sentry - Batcave: Inner Sanctum, Batcave: Outer Caverns, Rampaging Citizen - Smallville"});
  armorCollection.push({name:"Zealot's Shoulders",type:"Shoulders",role:"DPS",style:"Psycho",drops:"Scarecrow"});
  armorCollection.push({name:"Pauldrons of Astral Insight",type:"Shoulders",role:"DPS",style:"Astral Alloy",drops:"Subavatar South Gotham"});

  armorCollection.push({name:"Abyssal Peril Gauntlets",type:"Hands",role:"DPS",style:"Demonic",drops:"Present in Vault"});
  armorCollection.push({name:"Acid-Proof Gloves",type:"Hands",role:"Controller",style:"Antifreeze",drops:"Hypnotized CCPD Deputy - Cosmic Treadmill: Flashback, Treasure Chest - Ace Chemicals"});
  armorCollection.push({name:"Advanced Gorilliumweave Gloves",type:"Hands",role:"DPS",style:"",drops:"Present in Vault"});
  armorCollection.push({name:"Aggressive Invader's Armguards",type:"Hands",role:"DPS",style:"Brainiac Invader",drops:"Brainiac Stealth Unit Beta - T3 Alert South Gotham"});
  armorCollection.push({name:"Amazonian Hippocratic Gauntlets",type:"Hands",role:"Healer",style:"Amazonian",drops:"Drop"});
  armorCollection.push({name:"Amazonian Lancer's Gauntlets",type:"Hands",role:"DPS",style:"Amazonian",drops:"Treasure Chest"});
  armorCollection.push({name:"Amazonian Vanguard's Gauntlets",type:"Hands",role:"Tank",style:"Amazonian",drops:"Treasure Chest"});
  armorCollection.push({name:"Armored Kote of the Assassin",type:"Hands",role:"DPS",style:"League of Assassins",drops:"Drop"});
  armorCollection.push({name:"Articulated Synthweave Gloves",type:"Hands",role:"DPS",style:"Split Personality",drops:"Penguin"});
  armorCollection.push({name:"Avatar Infiltrator's Piercers",type:"Hands",role:"DPS",style:"Avatar Infiltrator",drops:"Avatar of Meta"});
  armorCollection.push({name:"Azarathian Warlock's Gloves",type:"Hands",role:"DPS",style:"Demonic",drops:"The Titans - A Shadow of Hell"});
  armorCollection.push({name:"Battle-Worn Gauntlets",type:"Hands",role:"DPS",style:"Greco-Roman",drops:"Clayface"});
  armorCollection.push({name:"Bunker Dweller's Gauntlets",type:"Hands",role:"DPS",style:"",drops:"Present in Vault"});
  armorCollection.push({name:"Chemist's Articulated Gloves",type:"Hands",role:"DPS",style:"Tech Ninja",drops:"Drop"});
  armorCollection.push({name:"Compound Inertron Gloves",type:"Hands",role:"Tank",style:"Fourth World",drops:"Treasure Chest"});
  armorCollection.push({name:"Corrupted Kryptonian Gauntlets",type:"Hands",role:"DPS",style:"Kryptonian Crystal",drops:"Corrupt Jor-El A.I."});
  armorCollection.push({name:"Council Advisor Gloves",type:"Hands",role:"Healer",style:"Kryptonian Medico",drops:"T3 Terminal"});
  armorCollection.push({name:"Cyberline Grips",type:"Hands",role:"DPS",style:"Robotic",drops:"OMAC"});
  armorCollection.push({name:"Deranger's Grips",type:"Hands",role:"DPS",style:"Psycho",drops:"Poison Ivy"});
  armorCollection.push({name:"Desert Willworker's Gloves",type:"Hands",role:"DPS",style:"Snake",drops:"Treasure Chest"});
  armorCollection.push({name:"Divine Handwraps of the Goddess Isis",type:"Hands",role:"DPS",style:"Isis",drops:"Isis"});
  armorCollection.push({name:"Divine Handwraps of the Goddess Isis",type:"Hands",role:"DPS",style:"Isis",drops:"Isis"});
  armorCollection.push({name:"Doctor Fate's Managrips",type:"Hands",role:"DPS",style:"Doctor Fate",drops:"Doctor Fate"});
  armorCollection.push({name:"Dominator's Gloves",type:"Hands",role:"DPS",style:"Jah Kir",drops:"Present in Vault"});
  armorCollection.push({name:"Energy Battery Gloves",type:"Hands",role:"DPS",style:"Energy Battery",drops:"Krona"});
  armorCollection.push({name:"Enhanced Spec-Ops Gloves",type:"Hands",role:"Healer",style:"Military Tech",drops:"Guard Captain Bombus"});
  armorCollection.push({name:"Fine Orichalcum Gloves",type:"Hands",role:"DPS",style:"Egyptian",drops:"Felix Faust"});
  armorCollection.push({name:"Fortress Gauntlets of Crystal",type:"Hands",role:"Tank",style:"Kryptonian",drops:"Sunstone Broodmother - Fortress of Solitude: The Chasm"});
  armorCollection.push({name:"Fortuneteller's Gloves",type:"Hands",role:"DPS",style:"Voodoo",drops:"Drop"});
  armorCollection.push({name:"Fur-Lined Promethium Gauntlets",type:"Hands",role:"Tank",style:"Medieval",drops:"Queen Bee"});
  armorCollection.push({name:"Gage of the Enforcer",type:"Hands",role:"DPS",style:"Oolong",drops:"Sunstone Herald - Fortress of Solitude: The Chasm"});
  armorCollection.push({name:"Gauntlets of the Deceiver",type:"Hands",role:"DPS",style:"Greco-Roman",drops:"Circe"});
  armorCollection.push({name:"Gauntlets of the Holy",type:"Hands",role:"Healer",style:"Medieval",drops:"Drop"});
  armorCollection.push({name:"Gauntlets of the Round",type:"Hands",role:"Controller",style:"Medieval",drops:"Tornado Tyrant"});
  armorCollection.push({name:"Gleaming Power Gloves",type:"Hands",role:"Tank",style:"Sector Agent",drops:"Lyssa Dark"});
  armorCollection.push({name:"Gloves of the Ancient Builders",type:"Hands",role:"DPS",style:"Egyptian",drops:"Present in Vault"});
  armorCollection.push({name:"Gloves of the Ancients",type:"Hands",role:"DPS",style:"Druid",drops:"Drop"});
  armorCollection.push({name:"Gloves of Clinging",type:"Hands",role:"DPS",style:"Bat Gauntlet",drops:"Present in Vault"});
  armorCollection.push({name:"Gloves of the Maker",type:"Hands",role:"DPS",style:"Angelic",drops:"Drop"});
  armorCollection.push({name:"Gloves of the Commando",type:"Hands",role:"Tank",style:"Military Tech",drops:"Brainiac Patroller"});
  armorCollection.push({name:"Gorillatech Cybergauntlets",type:"Hands",role:"DPS",style:"Biomech",drops:"Tiny"});
  armorCollection.push({name:"Grasp of the Conqueror",type:"Hands",role:"Controller",style:"Winged Fury",drops:"Bat Sentinels"});
  armorCollection.push({name:"Grasp of the Shadowpact",type:"Hands",role:"DPS",style:"Druid",drops:"Treasure Chest"});
  armorCollection.push({name:"Grips of Asgaard",type:"Hands",role:"DPS",style:"Contemporary Tech",drops:"Bruno Mannheim"});
  armorCollection.push({name:"Grips of Kandor",type:"Hands",role:"Tank",style:"Sunstone Bulwark",drops:"T3 Terminal"});
  armorCollection.push({name:"Grips of the Archdruid",type:"Hands",role:"DPS",style:"Druid",drops:"Soulless Shell"});
  armorCollection.push({name:"Grips of the Doomsayer",type:"Hands",role:"DPS",style:"Mayan",drops:"Catwoman"});
  armorCollection.push({name:"Grips of the Righteous",type:"Hands",role:"Healer",style:"Rapture",drops:"General Adnan"});
  armorCollection.push({name:"Grips of the World's End",type:"Hands",role:"Healer",style:"Seraph",drops:"Eradicator"});
  armorCollection.push({name:"Guarded Shinobi Gauntlets",type:"Hands",role:"DPS",style:"Tech Ninja",drops:"Drop"});
  armorCollection.push({name:"Hands of Kandor",type:"Hands",role:"Tank",style:"Sunstone Bulwark",drops:"T3 Terminal"});
  armorCollection.push({name:"Hardened Inertron Gloves",type:"Hands",role:"Controller",style:"Military Tech",drops:"Arkillo"});
  armorCollection.push({name:"Hyperion Sun Gauntlets",type:"Hands",role:"DPS",style:"Greco-Roman",drops:"Circe"});
  armorCollection.push({name:"Irradiant Enhanced Grips",type:"Hands",role:"DPS",style:"Sector Incendiary",drops:"Krona"});
  armorCollection.push({name:"Lambent Power Gloves",type:"Hands",role:"Controller",style:"Sector Agent",drops:"Kyle Rayner"});
  armorCollection.push({name:"Laminated Korugarian Handguards",type:"Hands",role:"DPS",style:"Shielded Robot",drops:"Sinestro"});
  armorCollection.push({name:"Lifebringer's Handwraps",type:"Hands",role:"Healer",style:"Shaman",drops:"Clayface"});
  armorCollection.push({name:"Light Nanomachined Gloves",type:"Hands",role:"DPS",style:"Tech Ninja",drops:"Treasure Chest"});
  armorCollection.push({name:"Lucent Power Gloves",type:"Hands",role:"Healer",style:"Sector Agent",drops:"Parallax"});
  armorCollection.push({name:"Magnus Robotics Prototype Gloves",type:"Hands",role:"DPS",style:"Robotic",drops:"Drop"});
  armorCollection.push({name:"Mammoth Gauntlets",type:"Hands",role:"DPS",style:"Barbarian",drops:"Treasure Chest"});
  armorCollection.push({name:"Manipulative Invader's Armguards",type:"Hands",role:"Controller",style:"Brainiac Invader",drops:"Treasure Chest - South Gotham Courthouse"});
  armorCollection.push({name:"Moonglow Gloves",type:"Hands",role:"DPS",style:"Druid",drops:"Whitetip"});
  armorCollection.push({name:"Necropolis Gauntlets",type:"Hands",role:"DPS",style:"Necromancer",drops:"Drops in The Greenhouse Challenge, Hush in Gotham Old Subway Challenge, Gotham University Warehouse, Gotham University DUO, Venom Supplier Diego in Cape Carmine Lighthouse DUO"});
  armorCollection.push({name:"New Genesis Gloves",type:"Hands",role:"DPS",style:"New Genesis",drops:"Present in Vault"});
  armorCollection.push({name:"Nth-Metal Officer's Gloves",type:"Hands",role:"DPS",style:"Raptor Tech",drops:"The Gatekeeper"});
  armorCollection.push({name:"OmniScry Battle Grips",type:"Hands",role:"Tank",style:"Heartshard",drops:"OMAC Batman"});
  armorCollection.push({name:"Opalstone Gauntlets",type:"Hands",role:"DPS",style:"Remora",drops:"Sandtiger"});
  armorCollection.push({name:"Pit Fighter's Gauntlets",type:"Hands",role:"DPS",style:"New Genesis",drops:"Power Girl"});
  armorCollection.push({name:"Planar Tactitician's Gloves",type:"Hands",role:"Controller",style:"Kryptonian Commander",drops:"T3 Terminal"});
  armorCollection.push({name:"Power Girl's Reinforced Grips",type:"Hands",role:"DPS",style:"Power Girl",drops:"Sequoia Lord"});
  armorCollection.push({name:"Promethium Grips of Power",type:"Hands",role:"Tank",style:"Heartshard",drops:"The Gatekeeper"});
  armorCollection.push({name:"Promethium-Studded Gauntlets",type:"Hands",role:"DPS",style:"Barbarian",drops:"Drop"});
  armorCollection.push({name:"Prophet's Manawoven Handwraps",type:"Hands",role:"Healer",style:"Shaman",drops:"Isis"});
  armorCollection.push({name:"Prototype Fieldscanner Grips",type:"Hands",role:"DPS",style:"Retro Tech",drops:"Micro Security Bot"});
  armorCollection.push({name:"Regimental Gloves",type:"Hands",role:"Healer",style:"Kryptonian Medico",drops:"T3 Terminal"});
  armorCollection.push({name:"Reinforced Invader's Armguards",type:"Hands",role:"Tank",style:"Brainiac Invader",drops:"Brainiac Stealth Unit Beta - South Gotham CourtHouse"});
  armorCollection.push({name:"Science Council's Gloves",type:"Hands",role:"Healer",style:"Talon Lord",drops:"Sunstone Broodmother - Fortress of Solitude: The Chasm"});
  armorCollection.push({name:"Shielded Vanguard Gauntlets",type:"Hands",role:"DPS",style:"Tech Ninja",drops:"Guard Captain Bombus"});
  armorCollection.push({name:"Shielded Synthium Gauntlets",type:"Hands",role:"DPS",style:"Robotic",drops:"UGA Soldier"});
  armorCollection.push({name:"Sinestro's Banded Gauntlets",type:"Hands",role:"DPS",style:"Sinestro",drops:"Sinestro"});
  armorCollection.push({name:"Sinestro's Banded Gauntlets",type:"Hands",role:"DPS",style:"Sinestro",drops:"Sinestro"});
  armorCollection.push({name:"Stratiform Gauntlets",type:"Hands",role:"Controller",style:"Kryptonian Commander",drops:"T3 Terminal"});
  armorCollection.push({name:"Spiked Amazon's Gauntlets",type:"Hands",role:"DPS",style:"Greco-Roman",drops:"Present in Vault"});
  armorCollection.push({name:"Starguard Gloves",type:"Hands",role:"DPS",style:"Shielded Robot",drops:"Present in Vault"});
  armorCollection.push({name:"Summoner's Mystic Gloves",type:"Hands",role:"DPS",style:"Druid",drops:"Treasure Chest"});
  armorCollection.push({name:"Sunstone Gauntlets of Vigor",type:"Hands",role:"DPS",style:"Sunstone's Edge",drops:"T3 Terminal"});
  armorCollection.push({name:"Sunstone Grips of Might",type:"Hands",role:"DPS",style:"Sunstone's Edge",drops:"T3 Terminal"});
  armorCollection.push({name:"Terrasect Powered Grips",type:"Hands",role:"Controller",style:"Aerial Defender",drops:"Sunstone Broodmother - Fortress of Solitude: The Chasm"});
  armorCollection.push({name:"Timewalker's Handwraps",type:"Hands",role:"DPS",style:"Kabuki",drops:"Necro Magent Gruhn"});
  armorCollection.push({name:"Tribal Handwraps",type:"Hands",role:"Tank",style:"Shaman",drops:"Bat Sentinels"});
  armorCollection.push({name:"Twisted Bioshaped Gloves",type:"Hands",role:"DPS",style:"Insectoid",drops:"Major Force"});
  armorCollection.push({name:"Vicious Coluan Gloves",type:"Hands",role:"Controller",style:"Alien Tech",drops:"Meta-Human Leaders"});
  armorCollection.push({name:"Vigilante's Inertron Gloves",type:"Hands",role:"Controller",style:"Military Tech",drops:"OMAC Sigma"});
  armorCollection.push({name:"Vital Promethium Gauntlets",type:"Hands",role:"Tank",style:"Viking",drops:"Chemo - Ace Chemicals"});
  armorCollection.push({name:"Warlock's Handwraps",type:"Hands",role:"Controller",style:"Shaman",drops:"T2 Duo"});
  armorCollection.push({name:"Wingman's Equilibrity Gauntlets",type:"Hands",role:"DPS",style:"Raptor Tech",drops:"OMAC Batman"});
  armorCollection.push({name:"Witch Doctor's Gloves",type:"Hands",role:"DPS",style:"Voodoo",drops:"Drop"});
  armorCollection.push({name:"Worn Terrasect Grips",type:"Hands",role:"Controller",style:"Aerial Defender",drops:"Corrupt Jor-El A.I."});

  armorCollection.push({name:"Amazonian Arbiter's Belt",type:"Waist",role:"Controller",style:"Amazonian",drops:"Brainiac Bounder"});
  armorCollection.push({name:"Amazonian Vanguard's Belt",type:"Waist",role:"Tank",style:"Amazonian",drops:"Drop"});
  armorCollection.push({name:"Angor's Belt ",type:"Waist",role:"Tank",style:"Viking",drops:"Doomsday"});
  armorCollection.push({name:"Antifreeze Belt",type:"Waist",role:"DPS",style:"Antifreeze",drops:"Present in Vault"});
  armorCollection.push({name:"Aquaman's Royal Waistguard",type:"Waist",role:"DPS",style:"Aquaman",drops:"Circe - Condemned Shipping Office"});
  armorCollection.push({name:"Avatar Infiltrator's Cincture",type:"Waist",role:"DPS",style:"Avatar Infiltrator",drops:"Sunstone Domineer - Fortress of Solitude: The Chasm"});
  armorCollection.push({name:"Bane's Rageblind Belt",type:"Waist",role:"DPS",style:"Bane",drops:"Bane in Cape Carmine Lighthouse mission"});
  armorCollection.push({name:"Bane's Rageblind Belt",type:"Waist",role:"DPS",style:"Bane",drops:"Bane  in Cape Carmine Lighthouse DUO"});
  armorCollection.push({name:"Beatific Belt",type:"Waist",role:"DPS",style:"Angelic",drops:"Waterkeeper"});
  armorCollection.push({name:"Belt of Dreams",type:"Waist",role:"Tank",style:"Druid",drops:"Vanguard"});
  armorCollection.push({name:"Belt of Shrunken Skulls",type:"Waist",role:"DPS",style:"Voodoo",drops:"Treasure Chest"});
  armorCollection.push({name:"Belt of the Genetrix",type:"Waist",role:"DPS",style:"Retro Tech",drops:"Queen Bee"});
  armorCollection.push({name:"Belt of the Simian Threat",type:"Waist",role:"DPS",style:"Biomech",drops:"Present in Vault"});
  armorCollection.push({name:"Bindings of the Conqueror",type:"Waist",role:"Tank",style:"Sunstone Bulwark",drops:"T3 Terminal"});
  armorCollection.push({name:"Biosculpted Mutant Belt",type:"Waist",role:"Tank",style:"Insectoid",drops:"Bludhaven Avenger"});
  armorCollection.push({name:"Bioshaped Belt",type:"Waist",role:"DPS",style:"Biomech",drops:"The Flash & Original Flash"});
  armorCollection.push({name:"Blackgate Sash",type:"Waist",role:"DPS",style:"Necromancer",drops:"Drop"});
  armorCollection.push({name:"Boar's Buckle Belt",type:"Waist",role:"DPS",style:"Boar's Buckle",drops:"Brainiac Vanquisher - T4 Themyscira: The Gates of Tartarus"});
  armorCollection.push({name:"Braced Spartan Girdle",type:"Waist",role:"DPS",style:"Greco-Roman",drops:"Guard Captain Bombus"});
  armorCollection.push({name:"Chemical Warding Belt",type:"Waist",role:"DPS",style:"Tech Ninja",drops:"Treasure Chest"});
  armorCollection.push({name:"Cincture of Hope",type:"Waist",role:"Tank",style:"Sunstone Bulwark",drops:"T3 Terminal"});
  armorCollection.push({name:"Cincture of the Round",type:"Waist",role:"Controller",style:"Medieval",drops:"Chang Tzu"});
  armorCollection.push({name:"Coluan Belt of Rage",type:"Waist",role:"Controller",style:"Alien Tech",drops:"Subprime Regulator Zeta"});
  armorCollection.push({name:"Councillor's Sash of Distinction",type:"Waist",role:"Healer",style:"Talon Lord",drops:"Avatar of Meta"});
  armorCollection.push({name:"Crustacean Cinch",type:"Waist",role:"DPS",style:"Remora",drops:"Drop"});
  armorCollection.push({name:"Crystalized Girdle of the Defender",type:"Waist",role:"Tank",style:"Kryptonian",drops:"Prime Assassin"});
  armorCollection.push({name:"Desert Searcher's Inertron Waistguard",type:"Waist",role:"Controller",style:"Military Tech",drops:"Booster Gold"});
  armorCollection.push({name:"Dragon Belt of the Dark Lords",type:"Waist",role:"DPS",style:"Necromancer",drops:"Drop"});
  armorCollection.push({name:"Dragonscale Belt",type:"Waist",role:"Tank",style:"Barbarian",drops:"Vengeful Spirit"});
  armorCollection.push({name:"Ectoplasmic Girdle",type:"Waist",role:"DPS",style:"New Genesis",drops:"Doctor Psycho"});
  armorCollection.push({name:"Elite Nanite-Enhanced Belt",type:"Waist",role:"DPS",style:"Jah Kir",drops:"Drop"});
  armorCollection.push({name:"Extraplanetary Nourisher's Belt",type:"Waist",role:"Healer",style:"Snake",drops:"Drop"});
  armorCollection.push({name:"Fanged Belt of the Coercer",type:"Waist",role:"Controller",style:"Shaman",drops:"T2 Duo"});
  armorCollection.push({name:"Fierce Nanomachined Belt",type:"Waist",role:"DPS",style:"Barbarian",drops:"Subprime Regulator Zeta"});
  armorCollection.push({name:"Foreststep Belt",type:"Waist",role:"Healer",style:"Druid",drops:"Warder"});
  armorCollection.push({name:"Galactic Belt",type:"Waist",role:"DPS",style:"",drops:"Present in Vault"});
  armorCollection.push({name:"Girdle of the Faithful",type:"Waist",role:"Healer",style:"Medieval",drops:"T2 Duo"});
  armorCollection.push({name:"Gleaming Waistguard",type:"Waist",role:"Tank",style:"Sector Agent",drops:"Crazed Amon Sur"});
  armorCollection.push({name:"Gorillatech Survivalist's Belt",type:"Waist",role:"DPS",style:"Insectoid",drops:"Drop"});
  armorCollection.push({name:"Hallucinator's Guard",type:"Waist",role:"DPS",style:"Psycho",drops:"Subprime Regulator Alpha"});
  armorCollection.push({name:"Hellthreat Belt",type:"Waist",role:"DPS",style:"Demonic",drops:"Present in Vault"});
  armorCollection.push({name:"Hysteric's Cinch",type:"Waist",role:"DPS",style:"Retro Tech",drops:"Harley Quinn"});
  armorCollection.push({name:"Interlocking Spec-Ops Belt ",type:"Waist",role:"Healer",style:"Military Tech",drops:"Bolt Claw"});
  armorCollection.push({name:"Irradiant Waistguard",type:"Waist",role:"DPS",style:"Sector Incendiary",drops:"Kyle Rayner"});
  armorCollection.push({name:"Kryptonian Battlebelt",type:"Waist",role:"DPS",style:"New Genesis",drops:"Supergirl"});
  armorCollection.push({name:"Kryptonian Councilor's Belt",type:"Waist",role:"Controller",style:"Kryptonian Commander",drops:"T3 Terminal in Meta Wing"});
  armorCollection.push({name:"Lambent Waistguard",type:"Waist",role:"Controller",style:"Sector Agent",drops:"Krona"});
  armorCollection.push({name:"Linked Belt of the Enforcer",type:"Waist",role:"DPS",style:"Oolong",drops:"Avatar of Meta"});
  armorCollection.push({name:"Lucent Waistguard",type:"Waist",role:"Healer",style:"Sector Agent",drops:"Atrocitus"});
  armorCollection.push({name:"Manawoven Sash of Shadows",type:"Waist",role:"Healer",style:"Shaman",drops:"Booster Gold"});
  armorCollection.push({name:"Master's Sash of Potency",type:"Waist",role:"Controller",style:"Winged Fury",drops:"Pharaoh Vezina - Kahndaq"});
  armorCollection.push({name:"Mastermind's Belt",type:"Waist",role:"Controller",style:"Winged Fury",drops:"Zetta-Drone"});
  armorCollection.push({name:"Mutant Lord's Belt",type:"Waist",role:"Controller",style:"Antifreeze",drops:"Treasure Chest"});
  armorCollection.push({name:"Necromagent's Promethium Waistguard",type:"Waist",role:"Tank",style:"Medieval",drops:"OMAC Delta"});
  armorCollection.push({name:"Nightwalker's Belt",type:"Waist",role:"DPS",style:"Druid",drops:"Drop"});
  armorCollection.push({name:"Nightwalker's Shrouded Belt",type:"Waist",role:"DPS",style:"Druid",drops:"Drop"});
  armorCollection.push({name:"Poison Ivy's Cultivated Belt",type:"Waist",role:"DPS",style:"Poison Ivy",drops:"Poison Ivy"});
  armorCollection.push({name:"Poison Ivy's Thorny Cincture",type:"Waist",role:"DPS",style:"Poison Ivy",drops:"Sequoia Lord"});
  armorCollection.push({name:"Polished Plexiderm Belt",type:"Waist",role:"DPS",style:"Retro Tech",drops:"Drop"});
  armorCollection.push({name:"Promethium Waistguard of the Victors",type:"Waist",role:"Tank",style:"Heartshard",drops:"Pharaoh Vezina - Kahndaq"});
  armorCollection.push({name:"Recruit's Inertron Belt",type:"Waist",role:"Controller",style:"Military Tech",drops:"Arkillo"});
  armorCollection.push({name:"Reinforced Belt of the Prophet",type:"Waist",role:"Tank",style:"Voodoo",drops:"Treasure Chest"});
  armorCollection.push({name:"Reinforced Invader's Girdle",type:"Waist",role:"Tank",style:"Brainiac Invader",drops:"Treasure Chest - South Gotham Courthouse"});
  armorCollection.push({name:"Reinforced Neutronium Belt",type:"Waist",role:"DPS",style:"Raptor Tech",drops:"Armored Robotic Custodian"});
  armorCollection.push({name:"Reinforced Sunstone Belt",type:"Waist",role:"Healer",style:"Kryptonian Medico",drops:"T3 Terminal"});
  armorCollection.push({name:"Reinforced Sunstone Waistguard",type:"Waist",role:"Healer",style:"Kryptonian Medico",drops:"T3 Terminal"});
  armorCollection.push({name:"Restorative Bioshaped Waistband",type:"Waist",role:"Healer",style:"Alien Tech",drops:"Clayface"});
  armorCollection.push({name:"Restorative Invader's Girdle",type:"Waist",role:"Healer",style:"Brainiac Invader",drops:"Drop"});
  armorCollection.push({name:"Rhino's Buckle Belt",type:"Waist",role:"DPS",style:"Rhino's Buckle",drops:"Brainiac Vanquisher - T4 Themyscira: The Gates of Tartarus"});
  armorCollection.push({name:"Riveted Korllium Belt",type:"Waist",role:"DPS",style:"Fourth World",drops:"Treasure Chest"});
  armorCollection.push({name:"Riveted Powersuit Belt",type:"Waist",role:"DPS",style:"New Genesis",drops:"Present in Vault"});
  armorCollection.push({name:"Roggra's Belt",type:"Waist",role:"DPS",style:"Jah Kir",drops:"OMAC Nanosynth"});
  armorCollection.push({name:"Sash of Kings",type:"Waist",role:"DPS",style:"Egyptian",drops:"Drop"});
  armorCollection.push({name:"Sash of the Desert Sun",type:"Waist",role:"Healer",style:"Snake",drops:"Drop"});
  armorCollection.push({name:"Sash of the Necropolis",type:"Waist",role:"DPS",style:"Kabuki",drops:"OMAC Sigma"});
  armorCollection.push({name:"Savage Trickster's Belt",type:"Waist",role:"DPS",style:"Retro Tech",drops:"The Joker"});
  armorCollection.push({name:"Scythian Nth-Metal Belt",type:"Waist",role:"DPS",style:"Raptor Tech",drops:"Riot Control Prototype"});
  armorCollection.push({name:"Shielded Promethium Belt",type:"Waist",role:"DPS",style:"Fourth World",drops:"Drop"});
  armorCollection.push({name:"Shielded Synthium Sash",type:"Waist",role:"DPS",style:"Retro Tech",drops:"Buzzbomber"});
  armorCollection.push({name:"Shrunken Head Sash",type:"Waist",role:"DPS",style:"Voodoo",drops:"Drops in Ache Chemicals, Gotham Old Subway DUO, League of Assassins Stronghold, Metropolis City Hall DUO, Omac Base DUO"});
  armorCollection.push({name:"Snake Lord's Belt",type:"Waist",role:"DPS",style:"Snake",drops:"Hoplite Major"});
  armorCollection.push({name:"Soldier's Utility Belt",type:"Waist",role:"Tank",style:"Military Tech",drops:"T2 Duo"});
  armorCollection.push({name:"Specialized Slimline Belt",type:"Waist",role:"DPS",style:"Jah Kir",drops:"OMAC Delta"});
  armorCollection.push({name:"Stalwart Promethium Belt",type:"Waist",role:"Tank",style:"Heartshard",drops:"Zetta-Drone"});
  armorCollection.push({name:"Sunstone Belt",type:"Waist",role:"DPS",style:"Egyptian",drops:"Present in Vault"});
  armorCollection.push({name:"Sunstone Waistguard of Hope",type:"Waist",role:"DPS",style:"Sunstone's Edge",drops:"T3 Terminal"});
  armorCollection.push({name:"Sunstone Waistguard of Victory",type:"Waist",role:"DPS",style:"Sunstone's Edge",drops:"T3 Terminal"});
  armorCollection.push({name:"Supreme Waistguard of Virtue",type:"Waist",role:"Healer",style:"Rapture",drops:"Bat Sentinels"});
  armorCollection.push({name:"Synthium-Studded Belt",type:"Waist",role:"DPS",style:"Greco-Roman",drops:"Present in Vault"});
  armorCollection.push({name:"Terrasect Utility Belt",type:"Waist",role:"Controller",style:"Aerial Defender",drops:"Scorpionod MK-1 - Fortress of Solitude: The Chasm"});
  armorCollection.push({name:"Three-Son Belt",type:"Waist",role:"DPS",style:"Insectoid",drops:"Drop"});
  armorCollection.push({name:"Universal Protector's Belt",type:"Waist",role:"DPS",style:"Shielded Robot",drops:"Present in Vault"});
  armorCollection.push({name:"Vigorous Belt of Vitality",type:"Waist",role:"Healer",style:"Seraph",drops:"Prince Ulgo"});
  armorCollection.push({name:"Waistguard of the Divine Knight",type:"Waist",role:"Tank",style:"Medieval",drops:"Arkillo"});
  armorCollection.push({name:"Wonder Girl's Mystic Belt",type:"Waist",role:"DPS",style:"Wonder Girl",drops:"Drop"});
  armorCollection.push({name:"Belt of Crossing Souls",type:"Waist",role:"DPS",style:"Astral Alloy",drops:"Subavatar - South Gotham"});

  armorCollection.push({name:"Advanced Coluan Boots",type:"Feet",role:"DPS",style:"Contemporary Tech",drops:"Prime Servitor"});
  armorCollection.push({name:"Advanced Commander's Boots",type:"Feet",role:"DPS",style:"Robotic",drops:"Chang Tzu"});
  armorCollection.push({name:"Aggressive Invader's Treads",type:"Feet",role:"DPS",style:"Brainiac Invader",drops:"The Bailiff - South Gotham CourtHouse"});
  armorCollection.push({name:"Alien Threat Boots",type:"Feet",role:"DPS",style:"Jah Kir",drops:"Present in Vault"});
  armorCollection.push({name:"Amazonian Arbiter's Greaves",type:"Feet",role:"Controller",style:"Amazonian",drops:"Brainiac Swarm Master - T4 Themyscira: The Gates of Tartarus"});
  armorCollection.push({name:"Amazonian Lancer's Greaves",type:"Feet",role:"DPS",style:"Amazonian",drops:"Brainiac Vanquisher - T4 Themyscira: The Gates of Tartarus"});
  armorCollection.push({name:"Amazonian Vanguard's Greaves",type:"Feet",role:"Tank",style:"Amazonian",drops:"Drop"});
  armorCollection.push({name:"Archdruid's Treads",type:"Feet",role:"DPS",style:"Druid",drops:"Drop"});
  armorCollection.push({name:"Assassin's Armored Tabi",type:"Feet",role:"DPS",style:"League of Assassins",drops:"Ra's al Ghul"});
  armorCollection.push({name:"Avatar Inflitrator's Treads",type:"Feet",role:"DPS",style:"Avatar Infiltrator",drops:"Avatar of Meta"});
  armorCollection.push({name:"Banded Battleboots",type:"Feet",role:"DPS",style:"Barbarian",drops:"Treasure Chest"});
  armorCollection.push({name:"Boots of Nightmare",type:"Feet",role:"DPS",style:"",drops:"Eddie in Scarecrow Gotham Sewer mission"});
  armorCollection.push({name:"Boots of the Devout",type:"Feet",role:"Healer",style:"Medieval",drops:"Brainiac Guardian MK-XXII"});
  armorCollection.push({name:"Boots of the Loa",type:"Feet",role:"DPS",style:"Voodoo",drops:"Drop"});
  armorCollection.push({name:"Bright Coluan Battleboots ",type:"Feet",role:"Tank",style:"Necromancer",drops:"Drops in Area 51 Alert, Gotham University DUO, Cape Carmine Lighthouse DUO, Hive Base DUO"});
  armorCollection.push({name:"Briny Chitinous Boots",type:"Feet",role:"DPS",style:"Remora",drops:"Soul Striker"});
  armorCollection.push({name:"Cellkeeper's Stompers",type:"Feet",role:"DPS",style:"Fourth World",drops:"Treasure Chest"});
  armorCollection.push({name:"Clownsanity's Mutant Boots",type:"Feet",role:"DPS",style:"Mutant Clown",drops:"Clownsanity - Ace Chemicals"});
  armorCollection.push({name:"Coiled Striker's Boots",type:"Feet",role:"DPS",style:"Snake",drops:"Hoplite Spearmaiden"});
  armorCollection.push({name:"Cruel Stompers",type:"Feet",role:"DPS",style:"Retro Tech",drops:"Brainiac Joker-bot"});
  armorCollection.push({name:"Cyberlinked Inertron Boots",type:"Feet",role:"Controller",style:"Military Tech",drops:"Necro Magent Gruhn"});
  armorCollection.push({name:"Desert Wanderer's Boots",type:"Feet",role:"DPS",style:"Egyptian",drops:"Present in Vault"});
  armorCollection.push({name:"Dire Dragon Boots",type:"Feet",role:"DPS",style:"Necromancer",drops:"Drop"});
  armorCollection.push({name:"Doomsayer's Treads",type:"Feet",role:"DPS",style:"Mayan",drops:"Catwoman"});
  armorCollection.push({name:"Enforcer's Promethium Stompers",type:"Feet",role:"Tank",style:"Medieval",drops:"Killer Croc & Deathstroke in Cape Carmine Lighthouse DUO"});
  armorCollection.push({name:"Fearbringer's Manawoven Boots",type:"Feet",role:"Healer",style:"Shaman",drops:"Booster Gold"});
  armorCollection.push({name:"Frightening Helltreads",type:"Feet",role:"DPS",style:"Demonic",drops:"Present in Vault"});
  armorCollection.push({name:"Galactic Guardian's Boots",type:"Feet",role:"DPS",style:"Shielded Robot",drops:"Present in Vault"});
  armorCollection.push({name:"Gleaming Panelled Footguards",type:"Feet",role:"Tank",style:"Sector Agent",drops:"Scion of Fear - Star Labs Alert"});
  armorCollection.push({name:"Glorious Sabatons of the Lifewalker",type:"Feet",role:"Healer",style:"Rapture",drops:"Riot Control Prototype"});
  armorCollection.push({name:"Gorilla Stompers",type:"Feet",role:"DPS",style:"Biomech",drops:"Present in Vault"});
  armorCollection.push({name:"Hardened Inertron Boots",type:"Feet",role:"Controller",style:"Military Tech",drops:"Arkillo"});
  armorCollection.push({name:"Hardened Vanadium Boots",type:"Feet",role:"Tank",style:"Heartshard",drops:"OMAC Batman"});
  armorCollection.push({name:"Heavy Nanomachined Boots",type:"Feet",role:"DPS",style:"Tech Ninja",drops:"Treasure Chest"});
  armorCollection.push({name:"H'levenite Battleboots",type:"Feet",role:"DPS",style:"Insectoid",drops:"Drop"});
  armorCollection.push({name:"Insulated Plexiderm Boots",type:"Feet",role:"DPS",style:"Tech Ninja",drops:"Drop"});
  armorCollection.push({name:"Io's Boneweave Boots",type:"Feet",role:"DPS",style:"Greco-Roman",drops:"Panarchos Io"});
  armorCollection.push({name:"Irradiant Reinforced Stompers",type:"Feet",role:"DPS",style:"Sector Incendiary",drops:"Parallax"});
  armorCollection.push({name:"Journeyman's Boots",type:"Feet",role:"DPS",style:"Speed",drops:"Present in Vault"});
  armorCollection.push({name:"Lambent Panelled Footguards",type:"Feet",role:"Controller",style:"Sector Agent",drops:"Vice"});
  armorCollection.push({name:"Lifebringer's Boots",type:"Feet",role:"Healer",style:"Shaman",drops:"Sinestro"});
  armorCollection.push({name:"Lifestep Boots",type:"Feet",role:"Healer",style:"Snake",drops:"Treasure Chest"});
  armorCollection.push({name:"Light Nanomachined Boots",type:"Feet",role:"DPS",style:"Biomech",drops:"UGA Soldier in Gorilla Island Alert"});
  armorCollection.push({name:"Lightweight Vanadium Boots",type:"Feet",role:"DPS",style:"",drops:"OMAC Batman"});
  armorCollection.push({name:"Lucent Panelled Footguards",type:"Feet",role:"Healer",style:"Sector Agent",drops:"Crazed Amon Sur"});
  armorCollection.push({name:"Manawalkers",type:"Feet",role:"DPS",style:"Druid",drops:"Treasure Chest - Cosmic Treadmill: Flashback, Gotham University DUO, Omac Base DUO"});
  armorCollection.push({name:"Manipulative Invader's Treads",type:"Feet",role:"Controller",style:"Brainiac Invader",drops:"The Attorneys - South Gotham CourtHouse"});
  armorCollection.push({name:"Miracle-Worker's Boots",type:"Feet",role:"Healer",style:"Rapture",drops:"OMAC Batman"});
  armorCollection.push({name:"Molded Biomesh Boots",type:"Feet",role:"DPS",style:"Snake",drops:"Drop"});
  armorCollection.push({name:"Nth-Metal Treads of the Towers",type:"Feet",role:"DPS",style:"Raptor Tech",drops:"Pharaoh Vezina - Kahndaq"});
  armorCollection.push({name:"Plane-Walkers",type:"Feet",role:"Controller",style:"Kryptonian Commander",drops:"T3 Terminal in Meta Wing"});
  armorCollection.push({name:"Powered Boots of the Enforcer",type:"Feet",role:"DPS",style:"Oolong",drops:"Sunstone Herald - Fortress of Solitude: The Chasm"});
  armorCollection.push({name:"Powered Terrasect Treads",type:"Feet",role:"Controller",style:"Aerial Defender",drops:"Sunstone Herald - Fortress of Solitude: The Chasm"});
  armorCollection.push({name:"Rao-Walkers",type:"Feet",role:"Healer",style:"Kryptonian Medico",drops:"T3 Terminal"});
  armorCollection.push({name:"Reinforced Biomesh Boots",type:"Feet",role:"DPS",style:"Fourth World",drops:"Treasure Chest"});
  armorCollection.push({name:"Reinforced Chem-Proof Boots",type:"Feet",role:"Tank",style:"Fourth World",drops:"Doomcrazed Citizen"});
  armorCollection.push({name:"Restorative Invader's Treads",type:"Feet",role:"Healer",style:"Brainiac Invader",drops:"The Attorneys - South Gotham CourtHouse"});
  armorCollection.push({name:"Riveted Synthium Battleboots ",type:"Feet",role:"DPS",style:"Jah Kir",drops:"Treasure Chest"});
  armorCollection.push({name:"Robust Promethium Boots",type:"Feet",role:"Tank",style:"Heartshard",drops:"Zetta-Drone"});
  armorCollection.push({name:"Sabatons of Justice",type:"Feet",role:"Tank",style:"Sunstone Bulwark",drops:"T3 Terminal"});
  armorCollection.push({name:"Sabatons of Vengeance",type:"Feet",role:"Tank",style:"Sunstone Bulwark",drops:"T3 Terminal"});
  armorCollection.push({name:"Sabatons of the Legion",type:"Feet",role:"DPS",style:"Greco-Roman",drops:"General Tethytus"});
  armorCollection.push({name:"Sabatons of the Rapturous Revenge",type:"Feet",role:"Healer",style:"Unknown",drops:""});
  armorCollection.push({name:"Sabatons of the Round",type:"Feet",role:"Controller",style:"Medieval",drops:"Burning Claw"});
  armorCollection.push({name:"Sabatons of the Seraph",type:"Feet",role:"DPS",style:"Angelic",drops:"Soulless Shell"});
  armorCollection.push({name:"Savage Nth-Metal Boots",type:"Feet",role:"DPS",style:"Raptor Tech",drops:"Brainiac"});
  armorCollection.push({name:"Sentinel's Earthen Clogs",type:"Feet",role:"DPS",style:"Kabuki",drops:"Queen Bee"});
  armorCollection.push({name:"Sharpened Talons of the Council",type:"Feet",role:"Healer",style:"Talon Lord",drops:"Sunstone Herald - Fortress of Solitude: The Chasm"});
  armorCollection.push({name:"Shining Promethium Boots",type:"Feet",role:"Tank",style:"Heartshard",drops:"The Gatekeeper"});
  armorCollection.push({name:"Simple Kandorian Battleboots",type:"Feet",role:"DPS",style:"New Genesis",drops:"Present in Vault"});
  armorCollection.push({name:"Slimline Twenty-Eye Boots",type:"Feet",role:"Healer",style:"Voodoo",drops:"Drop"});
  armorCollection.push({name:"Soldier's Combat Boots",type:"Feet",role:"Tank",style:"Military Tech",drops:"Brainiac Guardian MK-IV in Gotham Hospital T2 Duo"});
  armorCollection.push({name:"Sol-Treaders",type:"Feet",role:"Healer",style:"Kryptonian Medico",drops:"T3 Terminal"});
  armorCollection.push({name:"Spartan Shin Greaves",type:"Feet",role:"DPS",style:"Greco-Roman",drops:"Oolong Enforcer"});
  armorCollection.push({name:"Spiked Amazon's Sabatons",type:"Feet",role:"DPS",style:"Greco-Roman",drops:"Present in Vault"});
  armorCollection.push({name:"Spiked Boots of Lunacy",type:"Feet",role:"DPS",style:"Psycho",drops:"Drop"});
  armorCollection.push({name:"Spiked Crystalline Treads",type:"Feet",role:"Tank",style:"Kryptonian",drops:"Sunstone Broodmother - Fortress of Solitude: The Chasm"});
  armorCollection.push({name:"Sunstone Sabatons of Certainty",type:"Feet",role:"DPS",style:"Sunstone's Edge",drops:"T3 Terminal"});
  armorCollection.push({name:"Sunstone Sabatons of Force",type:"Feet",role:"DPS",style:"Sunstone's Edge",drops:"T3 Terminal"});
  armorCollection.push({name:"Supergirl's Kandorian Battleboots",type:"Feet",role:"DPS",style:"Supergirl",drops:"Doctor Psycho"});
  armorCollection.push({name:"Superior Inertron Boots",type:"Feet",role:"Controller",style:"Winged Fury",drops:"General Adnan"});
  armorCollection.push({name:"Spore-Laden Promethium Boots",type:"Feet",role:"Tank",style:"Medieval",drops:"OMAC Sigma"});
  armorCollection.push({name:"Stormforged Coluan Sabatons",type:"Feet",role:"Controller",style:"Alien Tech",drops:"Babyface - Ace Chemicals"});
  armorCollection.push({name:"Studded Blackmail Boots",type:"Feet",role:"DPS",style:"Antifreeze",drops:"Present in Vault"});
  armorCollection.push({name:"Studded Maltusian Boots",type:"Feet",role:"DPS",style:"Jah Kir",drops:"Drop"});
  armorCollection.push({name:"Synthweave Gang Stompers",type:"Feet",role:"DPS",style:"Split Personality",drops:"Penguin"});
  armorCollection.push({name:"Treads of Brawn",type:"Feet",role:"Tank",style:"Viking",drops:"Gorilla Grodd"});
  armorCollection.push({name:"Treads of Glory",type:"Feet",role:"Healer",style:"Seraph",drops:"Prime Servitor"});
  armorCollection.push({name:"Tribal Footwraps",type:"Feet",role:"Tank",style:"Shaman",drops:"Chang Tzu"});
  armorCollection.push({name:"Warlock's Footwraps",type:"Feet",role:"Controller",style:"Shaman",drops:"Brainiac Guardian MK-III"});
  armorCollection.push({name:"Zamaroni War Boots",type:"Feet",role:"DPS",style:"Jah Kir",drops:"OMAC"});
  armorCollection.push({name:"Greaves of the Astral Planarite",type:"Feet",role:"DPS",style:"Astral Alloy",drops:"SubAvatar South Gotham"});
  
  armorCollection.push({name:"Clown Nose",type:"Trinket",drops:"Present in Vault"});
  armorCollection.push({name:"Kryptonian Bouncy Sphere",type:"Trinket",drops:"Present in Vault"});
  armorCollection.push({name:"Sinister Clockwork Key",type:"Trinket",drops:"Present in Vault"});
  armorCollection.push({name:"Lion Tooth Juju",type:"Trinket",drops:"Present in Vault"});
  armorCollection.push({name:"Demon Figurine",type:"Trinket",drops:"Present in Vault"});
  armorCollection.push({name:"Manhunter Circuitry",type:"Trinket",drops:"Present in Vault"});
  armorCollection.push({name:"OMAC Nanite Circuitry",type:"Trinket",drops:"Present in Vault"});
  armorCollection.push({name:"Phantom Zone Kryptonite Chunk",type:"Trinket",drops:"Present in Vault"});
  armorCollection.push({name:"Prize Pumpkin",type:"Trinket",drops:"Present in Vault"});
  armorCollection.push({name:"Aquaman Tank",type:"Back",role:"DPS",style:"Aquaman",drops:"Present in Vault"});

  var weaponCollection = [];

  weaponCollection.push({name:"Combatant's Aggressive Bow",type:"Bow",role:"DPS",dps:131.1,drops:"Hall of Heroes room in Watchtower, Requisitions PvP vendor",style:"Selenic Bow"});

  weaponCollection.push({name:"Advanced Nanoguided Bow",type:"Bow",role:"DPS",dps:31.5,drops:""});
  weaponCollection.push({name:"Bow of Anger",type:"Bow",role:"Controller",dps:97.1,drops:"Pharaoh Vezina - Kahndaq"});
  weaponCollection.push({name:"Bow of the Galactic Emporer",type:"Bow",role:"Controller",dps:77.9,drops:"Sludge Thing"});
  weaponCollection.push({name:"Bow of the Island Sisters",type:"Bow",role:"Healer",dps:60.3,drops:""});
  weaponCollection.push({name:"Bow of the Necrolite Legion",type:"Bow",role:"DPS",dps:52.3,drops:"Mummy"});
  weaponCollection.push({name:"Bow of the Rapture",type:"Bow",role:"Healer",dps:77.9,drops:"Meta-Human Leaders"});
  weaponCollection.push({name:"Brimstone Bow",type:"Bow",role:"DPS",dps:65.1,drops:"Possessed Raven Spirit - Science Police HQ (Challlenge)"});
  weaponCollection.push({name:"Canopy Longbow",type:"Bow",role:"DPS",dps:41.1,drops:"Warder"});
  weaponCollection.push({name:"Compound Hunting Bow",type:"Bow",role:"DPS",dps:68.3,drops:"Killer Croc & Deathstroke Cape Carmine Lighthouse DUO"});
  weaponCollection.push({name:"Compound Tech Bow",type:"Bow",role:"DPS",dps:68.3,drops:"Atrocitus -  Ferris Aircraft"});
  weaponCollection.push({name:"Despot's Assault Longbow",type:"Bow",role:"DPS",dps:113.1,drops:"Non, Ursa, & General Zod - Fortress of Solitude: Sunstone Matrix"});
  weaponCollection.push({name:"Despot's Convalescent Longbow",type:"Bow",role:"Healer",dps:113.1,drops:"Non, Ursa, & General Zod - Fortress of Solitude: Sunstone Matrix"});
  weaponCollection.push({name:"Despot's Imperious Longbow",type:"Bow",role:"Controller",dps:113.1,drops:"Non, Ursa, & General Zod - Fortress of Solitude: Sunstone Matrix"});
  weaponCollection.push({name:"Despot's Shielded Longbow",type:"Bow",role:"Tank",dps:113.1,drops:"Non, Ursa, & General Zod - Fortress of Solitude: Sunstone Matrix"});
  weaponCollection.push({name:"Dormorian Hunter's Bow",type:"Bow",role:"DPS",dps:97.1,drops:"Riot Control Prototype - Dormorian Hunter's Bow"});
  weaponCollection.push({name:"Dread Lord's Longbow",type:"Bow",role:"Controller",dps:61.9,drops:""});
  weaponCollection.push({name:"Elite Korllium Stinger",type:"Bow",role:"DPS",dps:61.9,drops:""});
  weaponCollection.push({name:"Fiend's Bow",type:"Bow",role:"DPS",dps:68.3,drops:"OMAC Delta - Omac Base (Duo)"});
  weaponCollection.push({name:"Flying Soul Bow",type:"Bow",role:"Tank",dps:68.3,drops:"Necro Magent Gruhn"});
  weaponCollection.push({name:"Fortuneteller's Bow",type:"Bow",role:"Healer",dps:97.1,drops:"Riot Control Prototype - Batcave: Outer Caverns"});
  weaponCollection.push({name:"Guyverdine Longbow",type:"Bow",role:"DPS",dps:77.9,drops:"Elite Servitor"});
  weaponCollection.push({name:"Laser Cut Bow",type:"Bow",role:"Controller",dps:68.3,drops:"Atrocitus - Ferris Aircraft"});
  weaponCollection.push({name:"Longbow of Supremacy",type:"Bow",role:"Tank",dps:97.1,drops:"Black Adam"});
  weaponCollection.push({name:"Longbow of the Dead",type:"Bow",role:"Controller",dps:68.3,drops:"Zoom"});
  weaponCollection.push({name:"Necromancer's Twisted Bow",type:"Bow",role:"DPS",dps:61.9,drops:"Safe"});
  weaponCollection.push({name:"Pacific Bow",type:"Bow",role:"Healer",dps:97.1,drops:"Zetta-Drone"});
  weaponCollection.push({name:"Power-Infused Coluan Longbow",type:"Bow",role:"DPS",dps:68.3,drops:"Safe"});
  weaponCollection.push({name:"Prismatic Bow",type:"Bow",role:"DPS",dps:103.5,drops:"Sunstone Domineer - Fortress of Solitude: The Chasm"});
  weaponCollection.push({name:"Prismatic Champion Bow",type:"Bow",role:"Tank",dps:103.5,drops:""});
  weaponCollection.push({name:"Prismatic Control Bow",type:"Bow",role:"Controller",dps:103.5,drops:""});
  weaponCollection.push({name:"Prismatic Medico Bow",type:"Bow",role:"Healer",dps:103.5,drops:""});
  weaponCollection.push({name:"Quick Action Bow",type:"Bow",role:"Healer",dps:68.3,drops:"Atrocitus - Ferris Aircraft"});
  weaponCollection.push({name:"Reanimator's Bow",type:"Bow",role:"DPS",dps:77.9,drops:"Safe"});
  weaponCollection.push({name:"Reinforced Skyline Bow",type:"Bow",role:"DPS",dps:61.9,drops:""});
  weaponCollection.push({name:"Seraphim's Bow",type:"Bow",role:"DPS",dps:61.9,drops:""});
  weaponCollection.push({name:"Siege Knight's Bow",type:"Bow",role:"Tank",dps:90.7,drops:"Bolt Claw"});
  weaponCollection.push({name:"Slimline Sniper's Bow",type:"Bow",role:"DPS",dps:61.9,drops:""});
  weaponCollection.push({name:"Spellhunter's Bow",type:"Bow",role:"Controller",dps:58.7,drops:"Vengeful Spirit"});
  weaponCollection.push({name:"Stagg Industries Proto-Line Bow",type:"Bow",role:"DPS",dps:25.5,drops:""});
  weaponCollection.push({name:"STAR Proto-Power Battelbow Mk II",type:"Bow",role:"Controller",dps:97.1,drops:"Krona"});
  weaponCollection.push({name:"STAR Assault Battlebow",type:"Bow",role:"DPS",dps:90.7,drops:"The Lanterns"});
  weaponCollection.push({name:"STAR Recovery Battlebow",type:"Bow",role:"Healer",dps:90.7,drops:"Evil Star"});
  weaponCollection.push({name:"STAR Shielding Battlebow",type:"Bow",role:"Tank",dps:90.7,drops:"Atrocitus"});
  weaponCollection.push({name:"Steadfast Bow",type:"Bow",role:"Tank",dps:68.3,drops:"Vice - Ferris Aircraft"});
  weaponCollection.push({name:"Steamlord's Bow",type:"Bow",role:"DPS",dps:97.1,drops:"Zetta-Drone"});
  weaponCollection.push({name:"Surplus Armored Bow",type:"Bow",role:"Tank",dps:97.1,drops:"Queen Bee"});
  weaponCollection.push({name:"Surplus Assault Bow",type:"Bow",role:"DPS",dps:97.1,drops:"Serpent Claw"});
  weaponCollection.push({name:"Timeworn Dragon Bow",type:"Bow",role:"DPS",dps:77.9,drops:""});
  weaponCollection.push({name:"Titanium-Infused Composite Bow",type:"Bow",role:"Controller",dps:90.7,drops:"Queen Bee"});
  weaponCollection.push({name:"Valiant Bow of the Ten",type:"Bow",role:"DPS",dps:77.9,drops:"Villainy United"});
  weaponCollection.push({name:"Valorium-Plated Bow",type:"Bow",role:"Controller",dps:97.1,drops:"OMAC Batman"});
  weaponCollection.push({name:"Wizened Branch Bow",type:"Bow",role:"Healer",dps:68.3,drops:"OMAC Delta"});

  weaponCollection.push({name:"Aries Cestus",type:"Brawling",role:"DPS",dps:61.9,drops:"Undead Soldier"});
  weaponCollection.push({name:"Asteroid Cestus",type:"Brawling",role:"DPS",dps:77.9,drops:""});
  weaponCollection.push({name:"Aurora Power Gloves",type:"Brawling",role:"Tank",dps:77.9,drops:"Meta-Human Leaders"});
  weaponCollection.push({name:"Bludgeoners of Thanaldar",type:"Brawling",role:"DPS",dps:91.1,drops:"General Adnan"});
  weaponCollection.push({name:"Bonecrusher Resurrection Gloves",type:"Brawling",role:"Tank",dps:77.9,drops:"Elite Servitor"});
  weaponCollection.push({name:"Brawler's Earthstar Gauntlets",type:"Brawling",role:"DPS",dps:34.7,drops:"Beastiamorph Ravener"});
  weaponCollection.push({name:"Cestus of the North Winds",type:"Brawling",role:"Tank",dps:77.9,drops:"The Metal Mines"});
  weaponCollection.push({name:"Claws of the Wrathbringer",type:"Brawling",role:"Controller",dps:97.1,drops:"Bat Sentinels"});
  weaponCollection.push({name:"Claws of Time",type:"Brawling",role:"Controller",dps:68.3,drops:"Queen Bee"});
  weaponCollection.push({name:"Covenant Cestus",type:"Brawling",role:"DPS",dps:58.7,drops:""});
  weaponCollection.push({name:"Crusher's Cestus",type:"Brawling",role:"Controller",dps:77.9,drops:"Babyface - Ace Chemicals"});
  weaponCollection.push({name:"Crystal Cestus of Courage",type:"Brawling",role:"Tank",dps:97.1,drops:"General Adnan"});
  weaponCollection.push({name:"Crystalline Hammerhead Cestus",type:"Brawling",role:"DPS",dps:50.7,drops:""});
  weaponCollection.push({name:"Despot's Assault Glaives",type:"Brawling",role:"DPS",dps:113.1,drops:"Non, Ursa, & General Zod - Fortress of Solitude: Sunstone Matrix"});
  weaponCollection.push({name:"Despot's Convalescent Glaives",type:"Brawling",role:"Healer",dps:113.1,drops:"Non, Ursa, & General Zod - Fortress of Solitude: Sunstone Matrix"});
  weaponCollection.push({name:"Despot's Imperious Glaives",type:"Brawling",role:"Controller",dps:113.1,drops:"Non, Ursa, & General Zod - Fortress of Solitude: Sunstone Matrix"});
  weaponCollection.push({name:"Despot's Shielded Glaives",type:"Brawling",role:"Tank",dps:113.1,drops:"Non, Ursa, & General Zod - Fortress of Solitude: Sunstone Matrix"});
  weaponCollection.push({name:"Double-Edged Battle Gloves",type:"Brawling",role:"Tank",dps:68.3,drops:"Sinestro"});
  weaponCollection.push({name:"Fearful Spiked Knuckles",type:"Brawling",role:"DPS",dps:68.3,drops:"Penguin"});
  weaponCollection.push({name:"Glimmering Crystal Cestus",type:"Brawling",role:"DPS",dps:61.9,drops:"Area 51 Alert, Cape Carmine Lighthouse DUO, Omac Base DUO"});
  weaponCollection.push({name:"Hammerhead Cestus",type:"Brawling",role:"DPS",dps:77.9,drops:"Safe"});
  weaponCollection.push({name:"Hivelord's Cestus",type:"Brawling",role:"DPS",dps:65.1,drops:""});
  weaponCollection.push({name:"Hyper-Modified Karambit Gloves",type:"Brawling",role:"Controller",dps:90.7,drops:"Lying Claw"});
  weaponCollection.push({name:"Innovative Elementium Cestus",type:"Brawling",role:"Tank",dps:90.7,drops:"Tornado Tyrant"});
  weaponCollection.push({name:"Krypton-Tech Brawler's Gloves",type:"Brawling",role:"DPS",dps:61.9,drops:"Ancient Bloodroot - The Greenhouse Challenge, Machine Gun Tommy - Gotham Old Subway Challenge, OMAC - Omac Base DUO, OMAC Incinerator - Omac Base DUO, Panther Fang - Gotham University Warehouse, Paradox Reaper - Cosmic Treadmill: Flashback, Power Fist - League of Assassins Stronghold, Splint - Cape Carmine Lighthouse DUO, Tammy Two Guns - Gotham Old Subway DUO"});
  weaponCollection.push({name:"Leonine Cestus",type:"Brawling",role:"Tank",dps:97.1,drops:"OMAC Batman"});
  weaponCollection.push({name:"Lunar Crystal Cestus",type:"Brawling",role:"DPS",dps:68.3,drops:""});
  weaponCollection.push({name:"Norselord's Cestus",type:"Brawling",role:"Controller",dps:61.9,drops:""});
  weaponCollection.push({name:"OmniScry Offset Gauntlets",type:"Brawling",role:"DPS",dps:58.7,drops:""});
  weaponCollection.push({name:"Peerless Simium Cestus",type:"Brawling",role:"DPS",dps:61.9,drops:""});
  weaponCollection.push({name:"Plated Plexiderm Knuckles",type:"Brawling",role:"DPS",dps:61.9,drops:""});
  weaponCollection.push({name:"Prismatic Cestus",type:"Brawling",role:"DPS",dps:103.5,drops:"Sunstone Broodmother - Fortress of Solitude: The Chasm"});
  weaponCollection.push({name:"Prismatic Champion Cestus",type:"Brawling",role:"Tank",dps:103.5,drops:""});
  weaponCollection.push({name:"Prismatic Medico Cestus",type:"Brawling",role:"Healer",dps:103.5,drops:""});
  weaponCollection.push({name:"Ramfists",type:"Brawling",role:"DPS",dps:68.3,drops:"Safe"});
  weaponCollection.push({name:"Sagacious Cestus",type:"Brawling",role:"Controller",dps:97.1,drops:"Armored Robotic Custodian"});
  weaponCollection.push({name:"Sagittarius Cestus",type:"Brawling",role:"Healer",dps:97.1,drops:"Bat Family"});
  weaponCollection.push({name:"Savage Crystal Cestus",type:"Brawling",role:"DPS",dps:97.1,drops:"Brainiac"});
  weaponCollection.push({name:"Sharped Spiked Cestus",type:"Brawling",role:"DPS",dps:77.9,drops:"Eradicator"});
  weaponCollection.push({name:"Skartaris Claws",type:"Brawling",role:"DPS",dps:55.5,drops:"Soul Eater"});
  weaponCollection.push({name:"Specialized Assault Claws",type:"Brawling",role:"Tank",dps:33.1,drops:"UGA Commander"});
  weaponCollection.push({name:"Stagg Industries Proto-Line Gauntlets",type:"Brawling",role:"DPS",dps:25.5,drops:""});
  weaponCollection.push({name:"STAR Assault Knuckles",type:"Brawling",role:"DPS",dps:90.7,drops:"Parallax"});
  weaponCollection.push({name:"STAR Proto-Power Knuckles",type:"Brawling",role:"Controller",dps:90.7,drops:"Vice"});
  weaponCollection.push({name:"STAR Proto-Power Knuckles Mk II",type:"Brawling",role:"Controller",dps:97.1,drops:"The Lanterns"});
  weaponCollection.push({name:"STAR Recovery Knuckles Mk II",type:"Brawling",role:"Healer",dps:97.1,drops:"Scion of Will"});
  weaponCollection.push({name:"STAR Recovery Knuckles",type:"Brawling",role:"Healer",dps:90.7,drops:"Kyle Rayner"});
  weaponCollection.push({name:"STAR Shielding Knuckles",type:"Brawling",role:"Tank",dps:90.7,drops:"Scion of Will"});
  weaponCollection.push({name:"Surplus Assault Cesti",type:"Brawling",role:"DPS",dps:97.1,drops:"Ra's al Ghul"});
  weaponCollection.push({name:"Surplus Resto Cesti",type:"Brawling",role:"Healer",dps:97.1,drops:"Chief Engineer Wolzie"});
  weaponCollection.push({name:"Universal Power Claws",type:"Brawling",role:"Healer",dps:68.3,drops:"Gorilla Grodd"});

  weaponCollection.push({name:"Alchemist's Pistols",type:"Dual Pistol",role:"Healer",dps:97.1,drops:"Black Adam"});
  weaponCollection.push({name:"Ancient Amarathine Pistols",type:"Dual Pistol",role:"DPS",dps:68.3,drops:"Venus Flytrap"});
  weaponCollection.push({name:"Bringers of Death",type:"Dual Pistol",role:"DPS",dps:77.9,drops:"Doomsday"});
  weaponCollection.push({name:"Carbon Bolt Pistols",type:"Dual Pistol",role:"Tank",dps:90.7,drops:"Chang Tzu"});
  weaponCollection.push({name:"Carbon Storm Pistols",type:"Dual Pistol",role:"Controller",dps:90.7,drops:"Bat Family in Batcave: Outer Caverns Alert Alert"});
  weaponCollection.push({name:"Consecrated Silver Pistols",type:"Dual Pistol",role:"Healer",dps:60.3,drops:""});
  weaponCollection.push({name:"Demonhunter Specials",type:"Dual Pistol",role:"Controller",dps:52.3,drops:"Tigershark"});
  weaponCollection.push({name:"Despot's Assault Sub-Machine Guns",type:"Dual Pistol",role:"DPS",dps:113.1,drops:"Non, Ursa, & General Zod - Fortress of Solitude: Sunstone Matrix"});
  weaponCollection.push({name:"Despot's Convalescent Sub-Machine Guns",type:"Dual Pistol",role:"Healer",dps:113.1,drops:"Non, Ursa, & General Zod - Fortress of Solitude: Sunstone Matrix"});
  weaponCollection.push({name:"Despot's Imperious Sub-Machine Guns",type:"Dual Pistol",role:"Controller",dps:113.1,drops:"Non, Ursa, & General Zod - Fortress of Solitude: Sunstone Matrix"});
  weaponCollection.push({name:"Despot's Shielded Sub-Machine Guns",type:"Dual Pistol",role:"Tank",dps:113.1,drops:"Non, Ursa, & General Zod - Fortress of Solitude: Sunstone Matrix"});
  weaponCollection.push({name:"Eliminator's Pistols",type:"Dual Pistol",role:"Controller",dps:97.1,drops:"General Adnan"});
  weaponCollection.push({name:"Heavensent Pistols",type:"Dual Pistol",role:"Healer",dps:77.9,drops:"Rogues"});
  weaponCollection.push({name:"HIVE Guardian's Pistols",type:"Dual Pistol",role:"DPS",dps:68.3,drops:""});
  weaponCollection.push({name:"Large Capacity Bolt Pistols",type:"Dual Pistol",role:"Tank",dps:68.3,drops:"Penguin"});
  weaponCollection.push({name:"LK-9600 Spec-Ops Pistols",type:"Dual Pistol",role:"Controller",dps:61.9,drops:""});
  weaponCollection.push({name:"Pistols of Galactic Conquest",type:"Dual Pistol",role:"DPS",dps:97.1,drops:"The Gatekeeper"});
  weaponCollection.push({name:"Pistols of Magick Obscura",type:"Dual Pistol",role:"DPS",dps:77.9,drops:""});
  weaponCollection.push({name:"Pistols of the Deathbringer",type:"Dual Pistol",role:"DPS",dps:49.1,drops:"Soulless Shell"});
  weaponCollection.push({name:"Plated Neutronium Pistols",type:"Dual Pistol",role:"DPS",dps:97.1,drops:"Brother Eye"});
  weaponCollection.push({name:"Power-Infused SMG-97s",type:"Dual Pistol",role:"DPS",dps:68.3,drops:"Safe"});
  weaponCollection.push({name:"Prismatic Champion Pistols",type:"Dual Pistol",role:"Tank",dps:103.5,drops:""});
  weaponCollection.push({name:"Prismatic Control Pistols",type:"Dual Pistol",role:"Controller",dps:103.5,drops:""});
  weaponCollection.push({name:"Prismatic Medico Pistols",type:"Dual Pistol",role:"Healer",dps:103.5,drops:""});
  weaponCollection.push({name:"Prismatic Pistols",type:"Dual Pistol",role:"DPS",dps:103.5,drops:"Sunstone Herald - Fortress of Solitude: The Chasm"});
  weaponCollection.push({name:"Prisonlord's Pistols",type:"Dual Pistol",role:"DPS",dps:68.3,drops:"OMAC Sigma"});
  weaponCollection.push({name:"Promethium-Plated Pistols",type:"Dual Pistol",role:"Tank",dps:97.1,drops:"Riot Control Prototype"});
  weaponCollection.push({name:"Retribution of the Planets",type:"Dual Pistol",role:"Controller",dps:77.9,drops:"Watchman Duncan & Watchdog Rinty"});
  weaponCollection.push({name:"Requisitioned ServitorTech Pistols",type:"Dual Pistol",role:"DPS",dps:61.9,drops:""});
  weaponCollection.push({name:"Riverrock Revolvers",type:"Dual Pistol",role:"DPS",dps:50.7,drops:""});
  weaponCollection.push({name:"STAR Assault Pistols",type:"Dual Pistol",role:"DPS",dps:90.7,drops:"Vice"});
  weaponCollection.push({name:"STAR Assault Pistols Mk II",type:"Dual Pistol",role:"DPS",dps:97.1,drops:"Kyle Rayner"});
  weaponCollection.push({name:"STAR Proto-Power Pistols",type:"Dual Pistol",role:"Controller",dps:90.7,drops:"Crazed Amon Sur"});
  weaponCollection.push({name:"STAR Proto-Power Pistols Mk II",type:"Dual Pistol",role:"Controller",dps:97.1,drops:"Parallax"});
  weaponCollection.push({name:"STAR Recovery Pistols",type:"Dual Pistol",role:"Healer",dps:90.7,drops:"Scion of Will"});
  weaponCollection.push({name:"STAR Shielding Pistols",type:"Dual Pistol",role:"Tank",dps:90.7,drops:"Lyssa Drak"});
  weaponCollection.push({name:"STAR Shielding Pistols Mk II",type:"Dual Pistol",role:"Tank",dps:97.1,drops:"The Lanterns"});
  weaponCollection.push({name:"Tactical Assault Pistols",type:"Dual Pistol",role:"DPS",dps:61.9,drops:""});
  weaponCollection.push({name:"Technomagus Pistols",type:"Dual Pistol",role:"DPS",dps:61.9,drops:"Drops in Cape Carmine Lighthouse DUO, Gotham Old Subway Challenge, Gotham University Warehouse"});
  weaponCollection.push({name:"Untested Elementium Revolvers",type:"Dual Pistol",role:"DPS",dps:90.7,drops:"Lying Claw"});
  weaponCollection.push({name:"Veridium-Plated Pistols",type:"Dual Pistol",role:"DPS",dps:65.1,drops:"Harley Quinn"});
  weaponCollection.push({name:"Vigilante's Machine Pistols",type:"Dual Pistol",role:"Controller",dps:68.3,drops:"Zoom"});
  weaponCollection.push({name:"Warlord's Pistols",type:"Dual Pistol",role:"Tank",dps:77.9,drops:"Sludge Thing"});

  weaponCollection.push({name:"Abyssal Hammers",type:"Dual Wield",role:"Tank",dps:77.9,drops:"Doomsday"});
  weaponCollection.push({name:"Advanced Synthium Axes",type:"Dual Wield",role:"DPS",dps:61.9,drops:""});
  weaponCollection.push({name:"Assassin's Blades",type:"Dual Wield",role:"Healer",dps:68.3,drops:"Zoom"});
  weaponCollection.push({name:"Blades of Fate",type:"Dual Wield",role:"DPS",dps:65.1,drops:"Doctor Fate"});
  weaponCollection.push({name:"Blades of the Endless Sands",type:"Dual Wield",role:"DPS",dps:77.9,drops:"Safe"});
  weaponCollection.push({name:"Blade Dancer's Khadgas",type:"Dual Wield",role:"DPS",dps:61.9,drops:"Drops in Gorilla Grodd's Lab DUO, Cape Carmine Lighthouse DUO"});
  weaponCollection.push({name:"Butcher's Bloodletters",type:"Dual Wield",role:"Controller",dps:97.1,drops:"Riot Control Prototype"});
  weaponCollection.push({name:"Charged Batons",type:"Dual Wield",role:"Healer",dps:68.3,drops:"Vice"});
  weaponCollection.push({name:"Cleric's Hidden Blades",type:"Dual Wield",role:"Healer",dps:77.9,drops:"The Metal Mines"});
  weaponCollection.push({name:"Cleric's Maces",type:"Dual Wield",role:"Healer",dps:55.5,drops:"Soul Eater"});
  weaponCollection.push({name:"Cropper's Axes",type:"Dual Wield",role:"DPS",dps:77.9,drops:""});
  weaponCollection.push({name:"Dao Tech Swords",type:"Dual Wield",role:"DPS",dps:77.9,drops:"Protector of Anubis"});
  weaponCollection.push({name:"Despot's Assault Khadga",type:"Dual Wield",role:"DPS",dps:113.1,drops:"Non, Ursa, & General Zod - Fortress of Solitude: Sunstone Matrix"});
  weaponCollection.push({name:"Despot's Convalescent Khadga",type:"Dual Wield",role:"Healer",dps:113.1,drops:"Non, Ursa, & General Zod - Fortress of Solitude: Sunstone Matrix"});
  weaponCollection.push({name:"Despot's Imperious Khadga",type:"Dual Wield",role:"Controller",dps:113.1,drops:"Non, Ursa, & General Zod - Fortress of Solitude: Sunstone Matrix"});
  weaponCollection.push({name:"Despot's Shielded Khadga",type:"Dual Wield",role:"Tank",dps:113.1,drops:"Non, Ursa, & General Zod - Fortress of Solitude: Sunstone Matrix"});
  weaponCollection.push({name:"Elementalist's Cleavers",type:"Dual Wield",role:"Tank",dps:58.7,drops:""});
  weaponCollection.push({name:"Energized Batons",type:"Dual Wield",role:"Controller",dps:68.3,drops:"Vice"});
  weaponCollection.push({name:"Honed Korllium Axes",type:"Dual Wield",role:"DPS",dps:61.9,drops:"Safe"});
  weaponCollection.push({name:"Honed Neutronium Blades",type:"Dual Wield",role:"DPS",dps:97.1,drops:"Armored Robotic Custodian"});
  weaponCollection.push({name:"Honed Shinobi Blades",type:"Dual Wield",role:"Tank",dps:97.1,drops:"Bat Sentinels"});
  weaponCollection.push({name:"Honed Somelari War Axes",type:"Dual Wield",role:"DPS",dps:68.3,drops:""});
  weaponCollection.push({name:"Inanimate Carbon Rods",type:"Dual Wield",role:"Controller",dps:90.7,drops:"Burning Claw"});
  weaponCollection.push({name:"Inexorable Hammers",type:"Dual Wield",role:"Tank",dps:68.3,drops:"Booster Gold"});
  weaponCollection.push({name:"Jebidiah's Timeworn Khopesh",type:"Dual Wield",role:"DPS",dps:68.3,drops:"Necro Magent Gruhn"});
  weaponCollection.push({name:"Korugarian Skull Hammers",type:"Dual Wield",role:"DPS",dps:68.3,drops:"Sinestro"});
  weaponCollection.push({name:"Legionnaire's Blades",type:"Dual Wield",role:"DPS",dps:57.1,drops:""});
  weaponCollection.push({name:"Martensite Batons",type:"Dual Wield",role:"DPS",dps:68.3,drops:"Atrocitus"});
  weaponCollection.push({name:"Mechanized Elementium Hammers",type:"Dual Wield",role:"DPS",dps:90.7,drops:"Guard Captain Bombus"});
  weaponCollection.push({name:"Mystic Hammers of Wisdom",type:"Dual Wield",role:"Healer",dps:97.1,drops:"The Gatekeeper"});
  weaponCollection.push({name:"OmniScry Security Baton",type:"Dual Wield",role:"Controller",dps:68.3,drops:"Necro Magent Gruhn"});
  weaponCollection.push({name:"Painbringer's Rod",type:"Dual Wield",role:"Controller",dps:77.9,drops:"Gorilla Grodd"});
  weaponCollection.push({name:"Paired Technologist's Axes",type:"Dual Wield",role:"Controller",dps:61.9,drops:""});
  weaponCollection.push({name:"Prismatic Champion Maces",type:"Dual Wield",role:"Tank",dps:103.5,drops:""});
  weaponCollection.push({name:"Prismatic Maces",type:"Dual Wield",role:"DPS",dps:103.5,drops:"Sunstone Herald - Fortress of Solitude: The Chasm"});
  weaponCollection.push({name:"Scythian Blades",type:"Dual Wield",role:"DPS",dps:97.1,drops:"Black Adam"});
  weaponCollection.push({name:"STAR Assault Knives",type:"Dual Wield",role:"DPS",dps:90.7,drops:"Crazed Amon Sur"});
  weaponCollection.push({name:"STAR Assault Knives Mk II",type:"Dual Wield",role:"DPS",dps:97.1,drops:"Parallax"});
  weaponCollection.push({name:"Star Proto-Power Knives",type:"Dual Wield",role:"Controller",dps:90.7,drops:"Lyssa Drak"});
  weaponCollection.push({name:"STAR Proto-Power Knives Mk II",type:"Dual Wield",role:"Controller",dps:97.1,drops:"Atrocitus"});
  weaponCollection.push({name:"STAR Shielding Knives",type:"Dual Wield",role:"Tank",dps:90.7,drops:"The Lanterns"});
  weaponCollection.push({name:"Surplus Energized Blade",type:"Dual Wield",role:"Controller",dps:97.1,drops:"Guard Captain Bombus"});
  weaponCollection.push({name:"Twin Blades of the Champion",type:"Dual Wield",role:"Tank",dps:97.1,drops:"Brother Eye"});
  weaponCollection.push({name:"Twin Synth-Plated Maces",type:"Dual Wield",role:"Controller",dps:61.9,drops:""});



  weaponCollection.push({name:"Advanced Capacitor Gloves",type:"Hand Blaster",role:"DPS",dps:58.7,drops:"Brainiac Imprisoner"});
  weaponCollection.push({name:"Ancient Qwardian Cannons",type:"Hand Blaster",role:"DPS",dps:61.9,drops:"Envenomed Guard Dog in Cape Carmine Lighthouse DUO"});
  weaponCollection.push({name:"Articulated Inertron Blaster Gloves",type:"Hand Blaster",role:"DPS",dps:77.9,drops:""});
  weaponCollection.push({name:"Barbed Energy Blasters",type:"Hand Blaster",role:"Healer",dps:90.7,drops:"Queen Bee"});
  weaponCollection.push({name:"Blasters of Vengeance",type:"Hand Blaster",role:"Controller",dps:77.9,drops:"Chemo - Ace Chemicals"});
  weaponCollection.push({name:"Ceremonial Power Gloves of the Necropolis",type:"Hand Blaster",role:"DPS",dps:61.9,drops:"",style:"Magical Blast Foci"});
  weaponCollection.push({name:"Commander's Blaster Gloves",type:"Hand Blaster",role:"DPS",dps:60.3,drops:"Reconstructor"});
  weaponCollection.push({name:"Creeping Tendrils",type:"Hand Blaster",role:"DPS",dps:77.9,drops:"Prince Ulgo"});
  weaponCollection.push({name:"Despot's Assault Foci",type:"Hand Blaster",role:"DPS",dps:113.1,drops:"Non, Ursa, & General Zod - Fortress of Solitude: Sunstone Matrix"});
  weaponCollection.push({name:"Despot's Convalescent Foci",type:"Hand Blaster",role:"Healer",dps:113.1,drops:"Non, Ursa, & General Zod - Fortress of Solitude: Sunstone Matrix"});
  weaponCollection.push({name:"Despot's Imperious Foci",type:"Hand Blaster",role:"Controller",dps:113.1,drops:"Non, Ursa, & General Zod - Fortress of Solitude: Sunstone Matrix"});
  weaponCollection.push({name:"Despot's Shielded Foci",type:"Hand Blaster",role:"Tank",dps:113.1,drops:"Non, Ursa, & General Zod - Fortress of Solitude: Sunstone Matrix"});
  weaponCollection.push({name:"Elite Korllium Blasters",type:"Hand Blaster",role:"Controller",dps:68.3,drops:"Booster Gold"});
  weaponCollection.push({name:"Extraplanetary Power Gloves",type:"Hand Blaster",role:"DPS",dps:68.3,drops:""});
  weaponCollection.push({name:"Focusing Gloves of the Risen",type:"Hand Blaster",role:"DPS",dps:90.7,drops:"Bat Family in Batcave: Outer Caverns Alert Alert"});
  weaponCollection.push({name:"Mageblasters",type:"Hand Blaster",role:"DPS",dps:90.7,drops:"Gorilla Grodd"});
  weaponCollection.push({name:"Memento Mori",type:"Hand Blaster",role:"Healer",dps:77.9,drops:"Clownsanity - Ace Chemicals"});
  weaponCollection.push({name:"Nanobladed Blaster Gloves",type:"Hand Blaster",role:"DPS",dps:65.1,drops:"Harley Quinn"});
  weaponCollection.push({name:"Nanochined Blaster Gloves",type:"Hand Blaster",role:"DPS",dps:39.5,drops:"Altered Android"});
  weaponCollection.push({name:"Nanolinked Blaster Gloves",type:"Hand Blaster",role:"Healer",dps:61.9,drops:"",style:"Blaster Gauntlets"});
  weaponCollection.push({name:"Nautilus Handblasters",type:"Hand Blaster",role:"Tank",dps:68.3,drops:"Atrocitus"});
  weaponCollection.push({name:"Prismatic Blasters",type:"Hand Blaster",role:"DPS",dps:103.5,drops:"Scorpionod MK-1 - Fortress of Solitude: The Chasm"});
  weaponCollection.push({name:"Prismatic Champion Blasters",type:"Hand Blaster",role:"Tank",dps:103.5,drops:""});
  weaponCollection.push({name:"Prismatic Control Blasters",type:"Hand Blaster",role:"Controller",dps:103.5,drops:""});
  weaponCollection.push({name:"Prismatic Medico Blasters",type:"Hand Blaster",role:"Healer",dps:103.5,drops:""});
  weaponCollection.push({name:"Reaching Tentacles of the Damned",type:"Hand Blaster",role:"DPS",dps:33.1,drops:"Beastiamorph Berserker"});
  weaponCollection.push({name:"Skeletal Power Gloves",type:"Hand Blaster",role:"DPS",dps:97.1,drops:"Armored Robotic Custodian"});
  weaponCollection.push({name:"Skullhead Blasters",type:"Hand Blaster",role:"Tank",dps:97.1,drops:"The Gatekeeper"});
  weaponCollection.push({name:"Slayer's Blasters",type:"Hand Blaster",role:"Controller",dps:97.1,drops:"The Gatekeeper"});
  weaponCollection.push({name:"Soullinked Blaster Gloves",type:"Hand Blaster",role:"DPS",dps:61.9,drops:"",style:"Magical Blast Foci"});
  weaponCollection.push({name:"Spellpulse Gauntlets",type:"Hand Blaster",role:"DPS",dps:53.9,drops:"Sandtiger"});
  weaponCollection.push({name:"Spiritwalker Blasters",type:"Hand Blaster",role:"Healer",dps:97.1,drops:"General Adnan"});
  weaponCollection.push({name:"Spirit Guide Blaster Gloves",type:"Hand Blaster",role:"DPS",dps:58.7,drops:"Vengeful Spirit"});
  weaponCollection.push({name:"Stagg Industries Proto-Line Blaster Gloves",type:"Hand Blaster",role:"DPS",dps:23.3,drops:"Gorilla Technician"});
  weaponCollection.push({name:"STAR Assault Gloves",type:"Hand Blaster",role:"DPS",dps:90.7,drops:"Krona"});
  weaponCollection.push({name:"Star Conqueror's Blasters",type:"Hand Blaster",role:"Healer",dps:97.1,drops:"OMAC Batman"});
  weaponCollection.push({name:"STAR Proto-Power Pulse Gloves",type:"Hand Blaster",role:"Controller",dps:90.7,drops:"Scion of Fear - Star Labs Alert"});
  weaponCollection.push({name:"STAR Recovery Pulse Gloves",type:"Hand Blaster",role:"Healer",dps:90.7,drops:"Atrocitus"});
  weaponCollection.push({name:"STAR Shielding Gloves",type:"Hand Blaster",role:"Tank",dps:90.7,drops:"Parallax"});
  weaponCollection.push({name:"STAR Shielding Gloves Mk II",type:"Hand Blaster",role:"Tank",dps:97.1,drops:"Evil Star"});
  weaponCollection.push({name:"Star-Born Power Gloves",type:"Hand Blaster",role:"Controller",dps:61.9,drops:"Perimeter Guard"});
  weaponCollection.push({name:"Synthium Blaster Gloves",type:"Hand Blaster",role:"Controller",dps:33.1,drops:"UGA Elite Guard"});
  weaponCollection.push({name:"Thanagarian Enforcer's Blasters",type:"Hand Blaster",role:"DPS",dps:97.1,drops:"The Gatekeeper"});
  weaponCollection.push({name:"Thorned Channeling Gloves",type:"Hand Blaster",role:"Tank",dps:90.7,drops:"Oolong Enforcer"});
  weaponCollection.push({name:"Treelord's Blaster Gloves",type:"Hand Blaster",role:"Healer",dps:68.3,drops:"Isis"});
  weaponCollection.push({name:"Underlord's Blaster Gloves",type:"Hand Blaster",role:"DPS",dps:77.9,drops:""});
  weaponCollection.push({name:"Zamaron War Blasters",type:"Hand Blaster",role:"DPS",dps:68.3,drops:"Sinestro"});

  weaponCollection.push({name:"Advanced Carbon Katar",type:"Martial Arts",role:"Tank",dps:90.7,drops:"Bat Family in Batcave: Outer Caverns Alert Alert"});
  weaponCollection.push({name:"Advanced Veridium Katar",type:"Martial Arts",role:"DPS",dps:68.3,drops:"Safe"});
  weaponCollection.push({name:"Ancient Coluan Claws",type:"Martial Arts",role:"DPS",dps:61.9,drops:""});
  weaponCollection.push({name:"Anodized Evosynth Katar",type:"Martial Arts",role:"DPS",dps:58.7,drops:"Drone"});
  weaponCollection.push({name:"Blades of the Dragon",type:"Martial Arts",role:"Tank",dps:68.3,drops:"Atrocitus"});
  weaponCollection.push({name:"Ceremonial Blades of Skyra",type:"Martial Arts",role:"DPS",dps:55.5,drops:"Soul Eater"});
  weaponCollection.push({name:"Claws of Shadow",type:"Martial Arts",role:"Tank",dps:97.1,drops:"Pharaoh Vezina - Kahndaq"});
  weaponCollection.push({name:"Dark Mirrored Blades",type:"Martial Arts",role:"DPS",dps:61.9,drops:"Safe"});
  weaponCollection.push({name:"Cleric's Hoop Katar",type:"Martial Arts",role:"Healer",dps:61.9,drops:""});
  weaponCollection.push({name:"Despot's Assault Spikes",type:"Martial Arts",role:"DPS",dps:113.1,drops:"Non, Ursa, & General Zod - Fortress of Solitude: Sunstone Matrix"});
  weaponCollection.push({name:"Despot's Convalescent Spikes",type:"Martial Arts",role:"Healer",dps:113.1,drops:"Non, Ursa, & General Zod - Fortress of Solitude: Sunstone Matrix"});
  weaponCollection.push({name:"Despot's Imperious Spikes",type:"Martial Arts",role:"Controller",dps:113.1,drops:"Non, Ursa, & General Zod - Fortress of Solitude: Sunstone Matrix"});
  weaponCollection.push({name:"Despot's Shielded Spikes",type:"Martial Arts",role:"Tank",dps:113.1,drops:"Non, Ursa, & General Zod - Fortress of Solitude: Sunstone Matrix"});
  weaponCollection.push({name:"Elementalist's Cestus",type:"Martial Arts",role:"DPS",dps:61.9,drops:""});
  weaponCollection.push({name:"Enhanced Neomagnetic Katars",type:"Martial Arts",role:"Healer",dps:90.7,drops:"Burning Claw"});
  weaponCollection.push({name:"Grip of Death",type:"Martial Arts",role:"Healer",dps:97.1,drops:"Pharaoh Vezina - Kahndaq"});
  weaponCollection.push({name:"H'levenite Technician's Katar",type:"Martial Arts",role:"DPS",dps:61.9,drops:""});
  weaponCollection.push({name:"Iron Grips of the Risen",type:"Martial Arts",role:"DPS",dps:97.1,drops:"Ra's al Ghul"});
  weaponCollection.push({name:"Jebidiah's Sharp Katar",type:"Martial Arts",role:"DPS",dps:68.3,drops:""});
  weaponCollection.push({name:"Jeweled Claws of Gold",type:"Martial Arts",role:"Healer",dps:53.9,drops:"Thresher"});
  weaponCollection.push({name:"Katar of Power",type:"Martial Arts",role:"Tank",dps:77.9,drops:"Doomcrazed Giant"});
  weaponCollection.push({name:"Katar of the Ancient Protectors",type:"Martial Arts",role:"DPS",dps:68.3,drops:""});
  weaponCollection.push({name:"Katar of the Future",type:"Martial Arts",role:"Controller",dps:77.9,drops:"Rogues"});
  weaponCollection.push({name:"Katar of the Sun",type:"Martial Arts",role:"DPS",dps:97.1,drops:"General Adnan"});
  weaponCollection.push({name:"Katars of the Setting Sun",type:"Martial Arts",role:"DPS",dps:61.9,drops:"Chang Tzu Personal - Oolong Island Alert, Lion Mane - Gotham University Warehouse, Perimeter Guard -Batcave: Inner Sanctum, Batcave: Outer Caverns, Prisoner - Cosmic Treadmill: Flashback, Tiger Eye - Gotham University Warehouse DUO, Venom Supplier Diego - Cape Carmine Lighthouse DUO"});
  weaponCollection.push({name:"Lifegiver's Claws",type:"Martial Arts",role:"Healer",dps:97.1,drops:"Brother Eye"});
  weaponCollection.push({name:"Officer's Sharpened Claws",type:"Martial Arts",role:"Controller",dps:97.1,drops:"Black Adam"});
  weaponCollection.push({name:"OmniScry Fighter's Claws",type:"Martial Arts",role:"DPS",dps:77.9,drops:"Safe"});
  weaponCollection.push({name:"Pit Fighter's Claws",type:"Martial Arts",role:"DPS",dps:65.1,drops:"Sequoia Lord"});
  weaponCollection.push({name:"Plated Inertron Claws",type:"Martial Arts",role:"DPS",dps:42.7,drops:"Enraged Metal Man"});
  weaponCollection.push({name:"Prismatic Champion Katars",type:"Martial Arts",role:"Tank",dps:103.5,drops:""});
  weaponCollection.push({name:"Prismatic Control Katars",type:"Martial Arts",role:"Controller",dps:103.5,drops:""});
  weaponCollection.push({name:"Prismatic Katars",type:"Martial Arts",role:"DPS",dps:103.5,drops:"Scorpionod MK-1 - Fortress of Solitude: The Chasm"});
  weaponCollection.push({name:"Prismatic Medico Katars",type:"Martial Arts",role:"Healer",dps:103.5,drops:""});
  weaponCollection.push({name:"Simium Claws",type:"Martial Arts",role:"Healer",dps:68.3,drops:"Gorilla Grodd"});
  weaponCollection.push({name:"Sorceror's Hoopblade",type:"Martial Arts",role:"Healer",dps:77.9,drops:"Watchman Duncan & Watchdog Rinty"});
  weaponCollection.push({name:"Spacefarer's Katar",type:"Martial Arts",role:"DPS",dps:68.3,drops:""});
  weaponCollection.push({name:"Specialized Nanochined Claws",type:"Martial Arts",role:"DPS",dps:39.5,drops:"Safe"});
  weaponCollection.push({name:"STAR Assault Claws",type:"Martial Arts",role:"DPS",dps:90.7,drops:"Scion of Will"});
  weaponCollection.push({name:"STAR Assault Claws Mk II",type:"Martial Arts",role:"DPS",dps:97.1,drops:"Evil Star"});
  weaponCollection.push({name:"STAR Proto-Power Claws",type:"Martial Arts",role:"Controller",dps:90.7,drops:"Atrocitus"});
  weaponCollection.push({name:"STAR Proto-Power Claws Mk II",type:"Martial Arts",role:"Controller",dps:90.7,drops:"Scion of Will"});
  weaponCollection.push({name:"STAR Recovery Claws",type:"Martial Arts",role:"Healer",dps:90.7,drops:"Vice"});
  weaponCollection.push({name:"STAR Shielding Claws Mk II",type:"Martial Arts",role:"Tank",dps:97.1,drops:"Crazed Amon Sur"});
  weaponCollection.push({name:"STAR Shielding Claws",type:"Martial Arts",role:"Tank",dps:90.7,drops:"Evil Star"});
  weaponCollection.push({name:"Titanium-Infused Katars",type:"Martial Arts",role:"Controller",dps:90.7,drops:"Queen Bee"});
  weaponCollection.push({name:"Troublemaker's Claws",type:"Martial Arts",role:"DPS",dps:77.9,drops:"Prince Ulgo"});
  weaponCollection.push({name:"Venerable Solovarite Claws",type:"Martial Arts",role:"DPS",dps:41.1,drops:"Tiny"});
  weaponCollection.push({name:"Zamaron War Katars",type:"Martial Arts",role:"DPS",dps:68.3,drops:"Arkillo"});

  weaponCollection.push({name:"Aegis Claymore",type:"One-Handed",role:"Tank",dps:97.1,drops:"Riot Control Prototype"});
  weaponCollection.push({name:"Baton of Bone",type:"One-Handed",role:"DPS",dps:77.9,drops:"System Hacker"});
  weaponCollection.push({name:"Bio-Adaptive Chitin Blade",type:"One-Handed",role:"DPS",dps:44.3,drops:"Hive Interceptor"});
  weaponCollection.push({name:"Blade Dancer's Sword",type:"One-Handed",role:"Healer",dps:97.1,drops:"Bat Sentinels"});
  weaponCollection.push({name:"Blade of Mercy",type:"One-Handed",role:"Healer",dps:97.1,drops:"Zetta-Drone"});
  weaponCollection.push({name:"Council Hammer",type:"One-Handed",role:"DPS",dps:97.1,drops:"Black Adam"});
  weaponCollection.push({name:"Covert Hydra Dagger",type:"One-Handed",role:"DPS",dps:47.5,drops:"Construct"});
  weaponCollection.push({name:"Dark Mirrored Blade",type:"One-Handed",role:"Controller",dps:68.3,drops:"OMAC Delta"});
  weaponCollection.push({name:"Defender's Flowsteel Sabre",type:"One-Handed",role:"Tank",dps:97.1,drops:"OMAC Batman"});
  weaponCollection.push({name:"Despot's Convalescent Dagger",type:"One-Handed",role:"Healer",dps:113.1,drops:"Non, Ursa, & General Zod - Fortress of Solitude: Sunstone Matrix"});
  weaponCollection.push({name:"Despot's Imperious Dagger",type:"One-Handed",role:"Controller",dps:113.1,drops:"Non, Ursa, & General Zod - Fortress of Solitude: Sunstone Matrix"});
  weaponCollection.push({name:"Despot's Shielded Dagger",type:"One-Handed",role:"Tank",dps:113.1,drops:"Non, Ursa, & General Zod - Fortress of Solitude: Sunstone Matrix"});
  weaponCollection.push({name:"Escapee's Axe",type:"One-Handed",role:"DPS",dps:77.9,drops:"Rogues"});
  weaponCollection.push({name:"Extraplanetary Dao Tech Sword",type:"One-Handed",role:"DPS",dps:68.3,drops:"Safe"});
  weaponCollection.push({name:"Fine Korllium Khopesh",type:"One-Handed",role:"DPS",dps:61.9,drops:"Worker"});
  weaponCollection.push({name:"Fluted Coluan Battleaxe",type:"One-Handed",role:"DPS",dps:61.9,drops:"Blade Dancer"});
  weaponCollection.push({name:"Gearheart's Blade",type:"One-Handed",role:"DPS",dps:61.9,drops:""});
  weaponCollection.push({name:"Gear-Sword of Korwen",type:"One-Handed",role:"Tank",dps:90.7,drops:"Serpent Claw"});
  weaponCollection.push({name:"Hardened Evosynth Katana",type:"One-Handed",role:"DPS",dps:37.9,drops:"Protostar-SL"});
  weaponCollection.push({name:"Heavy Inertron Rod",type:"One-Handed",role:"DPS",dps:68.3,drops:"Safe"});
  weaponCollection.push({name:"Honed Inertron Sword",type:"One-Handed",role:"DPS",dps:68.3,drops:"Arkillo"});
  weaponCollection.push({name:"Inertron Baton",type:"One-Handed",role:"Controller",dps:34.7,drops:""});
  weaponCollection.push({name:"Innovative Blade of Vengeance",type:"One-Handed",role:"Controller",dps:90.7,drops:"Riot Control Prototype"});
  weaponCollection.push({name:"Jeweled Focusing Rod",type:"One-Handed",role:"Tank",dps:68.3,drops:"Killer Croc & Deathstroke Cape Carmine Lighthouse DUO"});
  weaponCollection.push({name:"Lizardman's Blade",type:"One-Handed",role:"Tank",dps:77.9,drops:"Lady Doombringer"});
  weaponCollection.push({name:"Nanofused Healer's Hammer",type:"One-Handed",role:"Healer",dps:39.5,drops:"Android"});
  weaponCollection.push({name:"Neutronium Axe",type:"One-Handed",role:"DPS",dps:97.1,drops:"Brother Eye"});
  weaponCollection.push({name:"Oasis Khadga",type:"One-Handed",role:"DPS",dps:68.3,drops:""});
  weaponCollection.push({name:"Ornate Blade of Thyme",type:"One-Handed",role:"Healer",dps:90.7,drops:"Chief Engineer Wolzie"});
  weaponCollection.push({name:"Parbati Iceblade",type:"One-Handed",role:"Healer",dps:68.3,drops:"Booster Gold"});
  weaponCollection.push({name:"Prismatic Champion Sword",type:"One-Handed",role:"Tank",dps:103.5,drops:""});
  weaponCollection.push({name:"Prismatic Control Sword",type:"One-Handed",role:"Controller",dps:103.5,drops:""});
  weaponCollection.push({name:"Prismatic Kora Sword",type:"One-Handed",role:"DPS",dps:103.5,drops:"Sunstone Broodmother - Fortress of Solitude: The Chasm"});
  weaponCollection.push({name:"Pulsehammer of the Stars",type:"One-Handed",role:"Controller",dps:97.1,drops:"General Adnan"});
  weaponCollection.push({name:"Ritual Katana of the Risen",type:"One-Handed",role:"DPS",dps:97.1,drops:"Ra's al Ghul"});
  weaponCollection.push({name:"Scarecrow's Sinister Cleaver",type:"One-Handed",role:"DPS",dps:87.5,drops:"Scarecrow"});
  weaponCollection.push({name:"Sharp Korllium Khopesh",type:"One-Handed",role:"DPS",dps:68.3,drops:""});
  weaponCollection.push({name:"Sharpened Synthium Katana",type:"One-Handed",role:"DPS",dps:26.6,drops:"Stinger"});
  weaponCollection.push({name:"Silver Blade of Azar",type:"One-Handed",role:"DPS",dps:65.1,drops:"Possessed Raven Spirit, Spirit of Raven - Science Police HQ (Challlenge)"});
  weaponCollection.push({name:"Skartaris Shortsword",type:"One-Handed",role:"Controller",dps:58.7,drops:"Vengeful Spirit"});
  weaponCollection.push({name:"Skartaris Tech Sword",type:"One-Handed",role:"DPS",dps:77.9,drops:"Safe"});
  weaponCollection.push({name:"STAR Assault Hammer",type:"One-Handed",role:"DPS",dps:90.7,drops:"Kyle Rayner"});
  weaponCollection.push({name:"STAR Recovery Hammer Mk II",type:"One-Handed",role:"Healer",dps:97.1,drops:"Parallax"});
  weaponCollection.push({name:"STAR Recovery Hammer",type:"One-Handed",role:"Healer",dps:90.7,drops:"The Lanterns"});
  weaponCollection.push({name:"STAR Proto-Power Hammer Mk II",type:"One-Handed",role:"Controller",dps:97.1,drops:"Kyle Rayner"});
  weaponCollection.push({name:"STAR Proto-Power Hammer",type:"One-Handed",role:"Controller",dps:90.7,drops:"Krona"});
  weaponCollection.push({name:"STAR Shielding Hammer",type:"One-Handed",role:"Tank",dps:90.7,drops:"Scion of Fear - Star Labs Alert"});
  weaponCollection.push({name:"Sword of Legend",type:"One-Handed",role:"Healer",dps:77.9,drops:"Prime Servitor"});
  weaponCollection.push({name:"Webbed Arachnid Blade",type:"One-Handed",role:"DPS",dps:61.3,drops:""});

  weaponCollection.push({name:"Alien Tech Rifle",type:"Rifle",role:"DPS",dps:61.9,drops:"Treasure Chest in Cape Carmine Lighthouse DUO, Gorilla Grodd's Lab DUO"});
  weaponCollection.push({name:"Bonespur Rifle",type:"Rifle",role:"DPS",dps:61.9,drops:""});
  weaponCollection.push({name:"Coluan Battle Rifle",type:"Rifle",role:"Tank",dps:97.1,drops:"OMAC Batman"});
  weaponCollection.push({name:"Composite Pulse Rifle",type:"Rifle",role:"DPS",dps:68.3,drops:"Vice"});
  weaponCollection.push({name:"Dark Lord's Rifle",type:"Rifle",role:"Tank",dps:97.1,drops:"General Adnan"});
  weaponCollection.push({name:"Death Stalker's Shotgun",type:"Rifle",role:"Controller",dps:90.7,drops:"Doctor Pyrate"});
  weaponCollection.push({name:"Despot's Assault Rifle",type:"Rifle",role:"DPS",dps:113.1,drops:"Non, Ursa, & General Zod - Fortress of Solitude: Sunstone Matrix"});
  weaponCollection.push({name:"Despot's Convalescent Assault Rifle",type:"Rifle",role:"Healer",dps:113.1,drops:"Non, Ursa, & General Zod - Fortress of Solitude: Sunstone Matrix"});
  weaponCollection.push({name:"Despot's Imperious Assault Rifle",type:"Rifle",role:"Controller",dps:113.1,drops:"Non, Ursa, & General Zod - Fortress of Solitude: Sunstone Matrix"});
  weaponCollection.push({name:"Despot's Shielded Assault Rifle",type:"Rifle",role:"Tank",dps:113.1,drops:"Non, Ursa, & General Zod - Fortress of Solitude: Sunstone Matrix"});
  weaponCollection.push({name:"Elite Enforcer's Rifle",type:"Rifle",role:"Controller",dps:97.1,drops:"Riot Control Prototype"});
  weaponCollection.push({name:"Enforcer's Deadly Shotgun",type:"Rifle",role:"DPS",dps:61.9,drops:"Bane - Gotham Old Subway Challenge, Cheetah Claw - Gotham University Warehouse, Guard Dog - Ace Chemicals, Inmate - Stryker's Island Penitentiary, Lion Mane - Gotham University Warehouse, Magent Neophyte - Mannheim's Chinese Theater Challenge, OMAC - Omac Base DUO, OMAC Incinerator - Omac Base DUO, Security Drone - Batcave: Outer Caverns Alert, Soulless Shell - Gotham University DUO, Soulless Thrall - Mannheim's Chinese Theater Challenge, Venom Supplier Diego - Cape Carmine Lighthouse DUO"});
  weaponCollection.push({name:"Fortune Hunter's Shotgun",type:"Rifle",role:"Healer",dps:90.7,drops:"Bolt Claw"});
  weaponCollection.push({name:"Gotham Underground Rifle",type:"Rifle",role:"DPS",dps:61.9,drops:"Treasure Chest - Cape Carmine Lighthouse DUO"});
  weaponCollection.push({name:"Grimfang Rifle",type:"Rifle",role:"Tank",dps:77.9,drops:"Dr. Richards"});
  weaponCollection.push({name:"Heartrender's Rifle",type:"Rifle",role:"DPS",dps:28.8,drops:"Hoplite Minor"});
  weaponCollection.push({name:"Iceshard Railgun",type:"Rifle",role:"Healer",dps:68.3,drops:"Queen Bee"});
  weaponCollection.push({name:"Immortal's Rifle",type:"Rifle",role:"Healer",dps:77.9,drops:"Subprime Regulator Alpha"});
  weaponCollection.push({name:"Inertron-Barrel Rifle",type:"Rifle",role:"Controller",dps:97.1,drops:"Armored Robotic Custodian"});
  weaponCollection.push({name:"Krypton-Tech Blast Rifle",type:"Rifle",role:"DPS",dps:77.9,drops:"Elite Servitor"});
  weaponCollection.push({name:"Light GorillaTech Rifle",type:"Rifle",role:"DPS",dps:61.9,drops:""});
  weaponCollection.push({name:"Light Inertron Minigun",type:"Rifle",role:"DPS",dps:37.9,drops:"Buzzbomber"});
  weaponCollection.push({name:"Massive Apokoliptian Rifle",type:"Rifle",role:"Tank",dps:61.9,drops:""});
  weaponCollection.push({name:"Massive Gorillatech Rifle",type:"Rifle",role:"DPS",dps:41.1,drops:"Tiny"});
  weaponCollection.push({name:"MPD Special",type:"Rifle",role:"DPS",dps:77.9,drops:""});
  weaponCollection.push({name:"MPU-47 Tactical",type:"Rifle",role:"Tank",dps:68.3,drops:"Penguin"});
  weaponCollection.push({name:"Obscura Rifle",type:"Rifle",role:"Tank",dps:61.9,drops:"Ancient Bloodroot - The Greenhouse Challenge, Brainiac Analyzer - Area 51 Alert, Doomcrazed Citizen - Smallville, Elite Servitor - Batcave: Inner Sanctum, Batcave: Brainiac Sub-Construct, Envenomed Strongman - Cape Carmine Lighthouse DUO, Hush - Gotham Old Subway Challenge, Security Captain - Meta Research Wing Challenge, Shield Armor - Batcave: Inner Sanctum, Batcave: Outer Caverns, Tiger Eye - Gotham University Warehouse	Beast, Undead Soldier - Gotham University DUO"});
  weaponCollection.push({name:"OmniScry Paramount Rifle",type:"Rifle",role:"Controller",dps:68.3,drops:"Gorilla Grodd"});
  weaponCollection.push({name:"Ornate Pulse Rifle",type:"Rifle",role:"DPS",dps:68.3,drops:"Vice"});
  weaponCollection.push({name:"Prismatic Champion Rifle",type:"Rifle",role:"Tank",dps:103.5,drops:""});
  weaponCollection.push({name:"Prismatic Control Rifle",type:"Rifle",role:"Controller",dps:103.5,drops:""});
  weaponCollection.push({name:"Prismatic Rifle",type:"Rifle",role:"DPS",dps:103.5,drops:"Sunstone Domineer - Fortress of Solitude: The Chasm"});
  weaponCollection.push({name:"Prototype Equilibrity Minigun",type:"Rifle",role:"DPS",dps:97.1,drops:"Brainiac"});
  weaponCollection.push({name:"Relic Rifle",type:"Rifle",role:"Healer",dps:97.1,drops:"Bat Family"});
  weaponCollection.push({name:"Silver Timewalkers Blunderbuss",type:"Rifle",role:"Controller",dps:41.1,drops:"Minion of Gluttony"});
  weaponCollection.push({name:"Smallville Heirloom Blunderbuss",type:"Rifle",role:"DPS",dps:77.9,drops:"Lazarus Thief"});
  weaponCollection.push({name:"Shotgun of the Legion",type:"Rifle",role:"DPS",dps:58.7,drops:""});
  weaponCollection.push({name:"Soulminder's Rifle",type:"Rifle",role:"DPS",dps:49.1,drops:"Soulless Shell"});
  weaponCollection.push({name:"Spellhunter's Shotgun",type:"Rifle",role:"DPS",dps:33.1,drops:"Hoplite Spearmaiden"});
  weaponCollection.push({name:"Steamheart Shotgun",type:"Rifle",role:"DPS",dps:65.1,drops:"Doctor Fate"});
  weaponCollection.push({name:"Starflung Explorer's Rifle",type:"Rifle",role:"Controller",dps:77.9,drops:"Dr. Richards"});
  weaponCollection.push({name:"STAR Assault Rifle",type:"Rifle",role:"DPS",dps:90.7,drops:"Evil Star"});
  weaponCollection.push({name:"STAR Proto-Power Bolt Rifle",type:"Rifle",role:"Controller",dps:90.7,drops:"The Lanterns"});
  weaponCollection.push({name:"STAR Recovery Bolt Rifle",type:"Rifle",role:"Healer",dps:90.7,drops:"Parallax"});
  weaponCollection.push({name:"STAR Recovery Bolt Rifle Mk II",type:"Rifle",role:"Healer",dps:97.1,drops:"Krona"});
  weaponCollection.push({name:"STAR Shielding Bolt Rifle",type:"Rifle",role:"Tank",dps:90.7,drops:"Krona"});
  weaponCollection.push({name:"Thanagarian Rifle",type:"Rifle",role:"DPS",dps:97.1,drops:"Bat Sentinels"});
  weaponCollection.push({name:"Unsanctioned Elementium Repulser",type:"Rifle",role:"DPS",dps:90.7,drops:"Riot Control Prototype"});
  weaponCollection.push({name:"Utopian's Shotgun",type:"Rifle",role:"DPS",dps:68.3,drops:"Safe"});
  weaponCollection.push({name:"Warlord's Gorillatech Rifle",type:"Rifle",role:"DPS",dps:68.3,drops:"Safe"});

  weaponCollection.push({name:"Bladed Reaper's Staff",            type:"Staff",role:"DPS",dps:68.3,drops:"Queen Bee"});
  weaponCollection.push({name:"Buzzing Energy Staff",             type:"Staff",role:"Controller",dps:97.1,drops:"The Gatekeeper"});
  weaponCollection.push({name:"Despot's Assault Staff",           type:"Staff",role:"DPS",dps:113.1,drops:"Non, Ursa, & General Zod - Fortress of Solitude: Sunstone Matrix"});
  weaponCollection.push({name:"Despot's Imperious Staff",         type:"Staff",role:"Controller",dps:113.1,drops:"Non, Ursa, & General Zod - Fortress of Solitude: Sunstone Matrix"});
  weaponCollection.push({name:"Despot's Shielded Staff",          type:"Staff",role:"Tank",dps:113.1,drops:"Non, Ursa, & General Zod - Fortress of Solitude: Sunstone Matrix"});
  weaponCollection.push({name:"Drox's Drillstaff",                type:"Staff",role:"Controller",dps:77.9,drops:"Subprime Regulator Zeta"});
  weaponCollection.push({name:"Elementalist's Staff",             type:"Staff",role:"DPS",dps:31.5,drops:"Hoplite Minor"});
  weaponCollection.push({name:"Emberborn Staff",                  type:"Staff",role:"Controller",dps:61.9,drops:""});
  weaponCollection.push({name:"Linkstaff of the Immortals",       type:"Staff",role:"DPS",dps:77.9,drops:""});
  weaponCollection.push({name:"Prismatic Staff",                  type:"Staff",role:"DPS",dps:103.5,drops:"Sunstone Herald - Fortress of Solitude: The Chasm"});
  weaponCollection.push({name:"Nanoweave Reinforced Bo",          type:"Staff",role:"DPS",dps:97.1,drops:"Ra's al Ghul"});
  weaponCollection.push({name:"Hammerlord Staff",                 type:"Staff",role:"DPS",dps:68.3,drops:""});
  weaponCollection.push({name:"Harvester of Death",               type:"Staff",role:"Healer",dps:90.7,drops:"Bat Sentinels"});
  weaponCollection.push({name:"Inventor's Staff",                 type:"Staff",role:"DPS",dps:68.3,drops:"Penguin"});
  weaponCollection.push({name:"Jebidiah's Timeworn Staff",        type:"Staff",role:"DPS",dps:68.3,drops:""});
  weaponCollection.push({name:"Legionnaire's Drillstaff",         type:"Staff",role:"Tank",dps:61.9,drops:"Android - Oolong Island Alert, Brainiac Spark - Area 51 Alert, Experiment 505 - Ace Chemicals, Guard Dog - Ace Chemicals, Paradox Reaper - Cosmic Treadmill: Flashback, Perimeter Guard - Batcave: Inner Sanctum, Batcave: Outer Caverns, Power Fist - League of Assassins Stronghold, Staff Master - League of Assassins Stronghold, Undead Soldier - Gotham University DUO
"});
  weaponCollection.push({name:"Light Synthium Staff",             type:"Staff",role:"DPS",dps:65.1,drops:"Sequoia Lord"});
  weaponCollection.push({name:"Mighty Reaper's Scythe",           type:"Staff",role:"Healer",dps:77.9,drops:"Doomcrazed Giant"});
  weaponCollection.push({name:"Obsidian Cleric's Staff",          type:"Staff",role:"Healer",dps:68.3,drops:"OMAC Delta"});
  weaponCollection.push({name:"Powerful Parbati Icestaff",        type:"Staff",role:"DPS",dps:61.9,drops:""});
  weaponCollection.push({name:"Prismatic Control Staff",          type:"Staff",role:"Controller",dps:103.5,drops:""});
  weaponCollection.push({name:"Prime Defender's Halberd",         type:"Staff",role:"Tank",dps:125.9,drops:"Brainiac"});
  weaponCollection.push({name:"Prismatic Champion Staff",         type:"Staff",role:"Tank",dps:103.5,drops:""});
  weaponCollection.push({name:"Prismatic Medico Staff",           type:"Staff",role:"Healer",dps:103.5,drops:""});
  weaponCollection.push({name:"Queen's Hookstaff",                type:"Staff",role:"Controller",dps:68.3,drops:"OMAC Sigma"});
  weaponCollection.push({name:"Ringstaff of Thanagar",            type:"Staff",role:"DPS",dps:97.1,drops:"Bat Family"});
  weaponCollection.push({name:"Rod of the Deathstalker",          type:"Staff",role:"DPS",dps:61.9,drops:""});
  weaponCollection.push({name:"Ruthless Staff of the Risen",      type:"Staff",role:"DPS",dps:90.7,drops:"Captain Buzzzcutt"});
  weaponCollection.push({name:"Scarablord's Staff",               type:"Staff",role:"DPS",dps:77.9,drops:"Safe"});
  weaponCollection.push({name:"Sealord's Staff",                  type:"Staff",role:"Healer",dps:97.1,drops:"Pharaoh Vezina - Kahndaq"});
  weaponCollection.push({name:"Sea King's Trident",               type:"Staff",role:"DPS",dps:58.7,drops:"Circe"});
  weaponCollection.push({name:"Seven-Fold Crescent Staff",        type:"Staff",role:"DPS",dps:61.9,drops:"Brainiac Drone"});
  weaponCollection.push({name:"Specialized Grappler's Staff",     type:"Staff",role:"Controller",dps:41.1,drops:"Altered Android"});
  weaponCollection.push({name:"Staff of Eternal Darkness",        type:"Staff",role:"Tank",dps:97.1,drops:"Black Adam"});
  weaponCollection.push({name:"Staff of Skulls",                  type:"Staff",role:"DPS",dps:77.9,drops:"Subprime Regulator Beta"});
  weaponCollection.push({name:"Staff of the Dead",                type:"Staff",role:"Tank",dps:77.9,drops:"Subprime Regulator Beta"});
  weaponCollection.push({name:"Staff of the Dragonslayer",        type:"Staff",role:"Controller",dps:36.3,drops:"Warder"});
  weaponCollection.push({name:"Staff of the Temple Guard",        type:"Staff",role:"Tank",dps:68.3,drops:"Vice"});
  weaponCollection.push({name:"Stagg Industries Proto-Line Staff",type:"Staff",role:"DPS",dps:25.5,drops:"Stinger"});
  weaponCollection.push({name:"STAR Proto-Power Staff",           type:"Staff",role:"Controller",dps:90.7,drops:"The Lanterns"});
  weaponCollection.push({name:"STAR Assault Staff",               type:"Staff",role:"DPS",dps:90.7,drops:"Scion of Fear - Star Labs Alert"});
  weaponCollection.push({name:"STAR Assault Staff Mk II",         type:"Staff",role:"DPS",dps:97.1,drops:"Vice"});
  weaponCollection.push({name:"STAR Recovery Staff",              type:"Staff",role:"Healer",dps:90.7,drops:"Lyssa Drak"});
  weaponCollection.push({name:"STAR Recovery Staff Mk II",        type:"Staff",role:"Healer",dps:97.1,drops:"Atrocitus"});
  weaponCollection.push({name:"Stormlord's Staff",                type:"Staff",role:"Tank",dps:97.1,drops:"Brother Eye"});
  weaponCollection.push({name:"Surplus Assault Spear",            type:"Staff",role:"DPS",dps:97.1,drops:"Bat Sentinels"});
  weaponCollection.push({name:"Surplus Resto Spear",              type:"Staff",role:"Healer",dps:97.1,drops:"Queen Bee"});
  weaponCollection.push({name:"Veridium-Plated Staff",            type:"Staff",role:"DPS",dps:68.3,drops:""});
  weaponCollection.push({name:"Vicious Coluan Scythe",            type:"Staff",role:"DPS",dps:97.1,drops:"Brainiac"});

  weaponCollection.push({name:"Accelerated Torque Hammer",             type:"Two-Handed",role:"Healer",dps:90.7,drops:"Tornado Tyrant"});
  weaponCollection.push({name:"Ancient Kryptonian Warhammer",          type:"Two-Handed",role:"DPS",dps:65.1,drops:"Supergirl"});
  weaponCollection.push({name:"Atom Smasher",                          type:"Two-Handed",role:"DPS",dps:97.1,drops:"Pharaoh Vezina - Kahndaq"});
  weaponCollection.push({name:"Beatific Millennia Hammer",             type:"Two-Handed",role:"Healer",dps:61.9,drops:"Bane - Gotham Old Subway DUO, Brainiac Spark - Area 51 Alert, Elite Subjugator - Batcave: Inner Sanctum, Gorilla Marksman - Gorilla Grodds Lab DUO, Gorilla Technician - Gorilla Grodds Lab DUO, Grodd's Pounders - Gorilla Grodd's Lab DUO, Soul Striker - Science Police HQ (Challlenge), Staff Master - League of Assassins Stronghold, Venom Supplier Diego - Cape Carmine Lighthouse DUO"});
  weaponCollection.push({name:"Bringer of Judgement",                  type:"Two-Handed",role:"Healer",dps:77.9,drops:"Subprime Regulator Zeta"});
  weaponCollection.push({name:"Buzzing Energy Axe",                    type:"Two-Handed",role:"DPS",dps:68.3,drops:"Prisoner - Cosmic Treadmill: Flashback, Staff Master - League of Assassins Stronghold, Treasure Chest - Ace Chemicals"});
  weaponCollection.push({name:"Despot's Convalescent Axe",             type:"Two-Handed",role:"Healer",dps:113.1,drops:"Non, Ursa, & General Zod - Fortress of Solitude: Sunstone Matrix"});
  weaponCollection.push({name:"Despot's Imperious Axe",                type:"Two-Handed",role:"Controller",dps:113.1,drops:"Non, Ursa, & General Zod - Fortress of Solitude: Sunstone Matrix"});
  weaponCollection.push({name:"Dread Lord's Saw Axe",                  type:"Two-Handed",role:"DPS",dps:61.9,drops:""});
  weaponCollection.push({name:"Emporer's Battlehammer",                type:"Two-Handed",role:"DPS",dps:61.9,drops:""});
  weaponCollection.push({name:"Evosynth Atom Smasher",                 type:"Two-Handed",role:"DPS",dps:39.5,drops:""});
  weaponCollection.push({name:"Faraday's Pulse Hammer",                type:"Two-Handed",role:"DPS",dps:68.3,drops:""});
  weaponCollection.push({name:"Glided Sawblade",                       type:"Two-Handed",role:"DPS",dps:68.3,drops:"Atrocitus"});
  weaponCollection.push({name:"Hammer of the Ages",                    type:"Two-Handed",role:"Healer",dps:97.1,drops:"Bat Sentinels"});
  weaponCollection.push({name:"Hammer of the Immortals",               type:"Two-Handed",role:"Tank",dps:97.1,drops:"Armored Robotic Custodian"});
  weaponCollection.push({name:"Hammer of the Legion",                  type:"Two-Handed",role:"Tank",dps:97.1,drops:"Bat Family"});
  weaponCollection.push({name:"Headhunter's Axe",                      type:"Two-Handed",role:"DPS",dps:77.9,drops:""});
  weaponCollection.push({name:"Healer's Shardblade",                   type:"Two-Handed",role:"Healer",dps:97.1,drops:"OMAC Batman"});
  weaponCollection.push({name:"Machined Synthium Hammer",              type:"Two-Handed",role:"DPS",dps:26.6,drops:"Muscle"});
  weaponCollection.push({name:"Mallet of Krypton",                     type:"Two-Handed",role:"Controller",dps:77.9,drops:"Subprime Regulator Alpha"});
  weaponCollection.push({name:"Mastermind's Claymore",                 type:"Two-Handed",role:"Controller",dps:53.9,drops:""});
  weaponCollection.push({name:"Mentalist's Hammer",                    type:"Two-Handed",role:"Healer",dps:68.3,drops:"Necro Magent Gruhn"});
  weaponCollection.push({name:"OmniScry Millennia Hammer",             type:"Two-Handed",role:"DPS",dps:68.3,drops:"Isis"});
  weaponCollection.push({name:"Prismatic Broadsword",                  type:"Two-Handed",role:"DPS",dps:103.5,drops:"Sunstone Herald - Fortress of Solitude: The Chasm"});
  weaponCollection.push({name:"Prismatic Control Broadsword",          type:"Two-Handed",role:"Controller",dps:103.5,drops:""});
  weaponCollection.push({name:"Protector's Steamwork Axe",             type:"Two-Handed",role:"Tank",dps:61.9,drops:""});
  weaponCollection.push({name:"Rocketmaster's Hammer",                 type:"Two-Handed",role:"Controller",dps:97.1,drops:"Bat Family"});
  weaponCollection.push({name:"Sequoia Lord's Sword",                  type:"Two-Handed",role:"DPS",dps:61.9,drops:""});
  weaponCollection.push({name:"Stagg Industries Proto-Line Warhammer", type:"Two-Handed",role:"DPS",dps:26.6,drops:"Stinger"});
  weaponCollection.push({name:"Starsoul's Mace",                       type:"Two-Handed",role:"DPS",dps:61.9,drops:""});
  weaponCollection.push({name:"STAR Assault Sword Mk II",              type:"Two-Handed",role:"DPS",dps:97.1,drops:"Atrocitus"});
  weaponCollection.push({name:"STAR Assault Sword",                    type:"Two-Handed",role:"DPS",dps:90.7,drops:"Lyssa Drak"});
  weaponCollection.push({name:"STAR Proto-Power Sword",                type:"Two-Handed",role:"Controller",dps:90.7,drops:"Kyle Rayner"});
  weaponCollection.push({name:"STAR Shielding Sword",                  type:"Two-Handed",role:"Tank",dps:90.7,drops:""});
  weaponCollection.push({name:"STAR Recovery Sword",                   type:"Two-Handed",role:"Healer",dps:90.7,drops:"Scion of Fear - Star Labs Alert"});
  weaponCollection.push({name:"Titanium Force Hammer",                 type:"Two-Handed",role:"Tank",dps:90.7,drops:"Chief Engineer Wolzie"});
  weaponCollection.push({name:"Titanium Quake Hammer",                 type:"Two-Handed",role:"Controller",dps:90.7,drops:"Bat Sentinels"});
  weaponCollection.push({name:"Triline Warhammer",                     type:"Two-Handed",role:"Tank",dps:61.9,drops:""});
  weaponCollection.push({name:"Umber's Hammer",                        type:"Two-Handed",role:"Tank",dps:77.9,drops:"Eradicator"});
  weaponCollection.push({name:"Wicked Sawhammer",                      type:"Two-Handed",role:"Controller",dps:68.3,drops:"Queen Bee"});

function isWeapon(weaponString)
{
  for (var i=0; i<weaponCollection.length; i++) {
    if (weaponString == weaponCollection[i].name) {
      return true;
    }
  }
  return false;
}


function arraySortByKeys( arrayIn )
{
  var keys = new Array();
  for(var k in arrayIn) {
    keys.push(k);
  }
  keys.sort(function(a,b) {return (a>b) - (a<b);});
  return keys;
}

function arraySortByKeysDate( arrayIn )
{
  var keys = new Array();
  for(var k in arrayIn) {
    keys.push(k);
  }
  keys.sort(function(a,b) {
    var aTS = parseFloat(convertDateStringToTimestamp(a));
    var bTS = parseFloat(convertDateStringToTimestamp(b));
    return (aTS - bTS);
  });
  return keys;
}

function arraySortByValues( arrayIn )
{
  var arrayCouplets = new Array();
  for( var key in arrayIn ) {
    arrayCouplets.push({
      key: key,
      value: arrayIn[ key ]
    });
  }
  arrayCouplets.sort( sort_couplets );
  var arrayOut = new Array();
  for( var i in arrayCouplets) {
    arrayOut[ arrayCouplets[ i ][ 'key' ] ] = arrayCouplets[ i ][ 'value' ];
  }
  return arrayOut;
}

function sort_couplets( coupletA, coupletB )
{
  return coupletA[ 'value' ] < coupletB[ 'value' ];
}

function sortByValue(objectIn) {

  var tuples = [];

  for (var key in objectIn) tuples.push([key, objectIn[key]]);

  tuples.sort(function(a, b) {
      a = a[1];
      b = b[1];
      return a < b ? -1 : (a > b ? 1 : 0);
  });

  return tuples;
}



function drawCollectionPieChart(metro, gotham, other)
{
  var graph_data = new google.visualization.DataTable();
  graph_data.addColumn('string', 'Collections');
  graph_data.addColumn('number', 'Count');
  graph_data.addRow(["Metropolis", metro]);
  graph_data.addRow(["Gotham", gotham]);
  graph_data.addRow(["Other", other]);

  var options = {
          title: 'Collection Distribution',
          'chartArea':{left:15,top:65,width:"100%"}
  };

  var chart = new google.visualization.PieChart(document.getElementById('LeftChartDiv'));
  chart.draw(graph_data, options);
}


function calculateCollections(character, startDateString, endDateString)
{
  var totalCollections = 0
  var associativeArray = {};
  var timestamp = 0;
  var typeOfItem = "";
  var totalMetropolis = 0;
  var totalGotham = 0;
  var totalOther = 0;

  var itype = "Collection";
  var startTS = convertDateStringToTimestamp(startDateString);
  var endTS = convertDateStringToTimestamp(endDateString);

  var people = [];
  var itemTotalPerDay = {};

  if (character == "All characters") {
    people = Object.keys(allLogLinesJSON);
  }
  else {
    people = [ character ];
  }

  people.forEach(function(person) {

    if (typeof(allLogLinesJSON[person]) != "undefined") {
      if (allLogLinesJSON[person].hasOwnProperty(itype)) {
        var itemArray = allLogLinesJSON[person][itype];

        for (var i=0; i<itemArray.length; i++) {
          timestamp = parseFloat(itemArray[i].time);

          if ((timestamp >= startTS) && (timestamp < endTS)) {
            typeOfItem = itemArray[i].item;
            if (typeof(associativeArray[ typeOfItem ]) != "undefined") {
              associativeArray[ typeOfItem ] += 1;
              if (isCollectionMetropolis(itemArray[i].item)) { totalMetropolis += 1; }
              else if (isCollectionGotham(itemArray[i].item)) { totalGotham += 1; }
              else if (isCollectionOther(itemArray[i].item)) { totalOther += 1; }
              else { console.log("Unknown collection: " + itemArray[i].item); }
            }
            else {
              associativeArray[ typeOfItem ] = 1;
            }
            totalCollections += 1;
            var currentDay = convertTimestampToDateString(timestamp);
            if (typeof(itemTotalPerDay[currentDay]) == "undefined") {
              itemTotalPerDay[currentDay] = 1;
            }
            else {
              itemTotalPerDay[currentDay] += 1;
            }
          }
        }
      }
    }
  });

  var Message = "";
  Message += "Character:         " + character + "\r\n";
  Message += "Date range:        " + startDateString + " through " + endDateString + "\r\n\r\n";
  Message += "Total Collections obtained: " + totalCollections + "\r\n\r\n";
  var maxItemLength = 50;
  Message += "Item".rpad(" ", maxItemLength) + "\tCount\tPercentage of Total\r\n\r\n";

  var sortedArray = arraySortByValues(associativeArray);

  for (var index in sortedArray) {
    Message += printLine(index, sortedArray[index], totalCollections, maxItemLength);
  }

  document.getElementById('StatsDisplay').style.display="block";
  document.getElementById('TableDisplay').style.display="none";

  document.getElementById("StatsDisplay").innerHTML = Message;
  drawCollectionPieChart(totalMetropolis, totalGotham, totalOther);
  drawItemChart(itemTotalPerDay, itype);
}


function calculateCollectionsNeeded(character, startDateString, endDateString)
{
  var totalCollections = 0
  var timestamp = 0;

  var collectionList = {};
  for (var i=0; i<collectionCollection.length; i++) {
    collectionList[collectionCollection[i].name] = 0;
  }

  var itype = "Collection";
  var startTS = convertDateStringToTimestamp(startDateString);
  var endTS = convertDateStringToTimestamp(endDateString);

  var people = [];

  if (character == "All characters") {
    people = Object.keys(allLogLinesJSON);
  }
  else {
    people = [ character ];
  }

  people.forEach(function(person) {

    if (typeof(allLogLinesJSON[person]) != "undefined") {
      if (allLogLinesJSON[person].hasOwnProperty(itype)) {
        var itemArray = allLogLinesJSON[person][itype];

        for (var i=0; i<itemArray.length; i++) {
          timestamp = parseFloat(itemArray[i].time);

          if ((timestamp >= startTS) && (timestamp < endTS)) {
            if (typeof(collectionList[itemArray[i].item]) == "undefined") {
              collectionList[itemArray[i].item] = 0;
            }
            collectionList[itemArray[i].item] += 1;
            totalCollections += 1;
          }
        }
      }
    }
  });

  var results = '';

  var cities = [ "Metropolis", "Gotham", "Central City", "Alerts", "Watchtower", "Hall of Doom" ];

  var categoriesMetropolis = [ "Alien Technology", "Bibbo's Burgers Signature Plates", "Brainiac War",
                               "Centennial", "Daily Planet Guides", "Gold Quality Boostercomms",
                               "Kryptonite Isotopes", "LexCorp Rapid Assualt Gear", "Mana Twisted Plants",
                               "MDP Science Corps", "Metahumanity's Vanguard", "Metropolis Fans",
                               "Metropolis Matchups", "Metropolis Street Signs", "News from Around the Planet",
                               "Signs of the Great Ten", "Sorcerous Vanguard", "STAR Prototype Gear",
                               "Steelworks Scraps", "You Are Wrong! Fanservice", "Lois Lane Bylines",
                               "Metropolis University" ];

  results +=  'Character:         ' + character + '<br>';
  results +=  'Date range:        ' + startDateString + ' through ' + endDateString  + '<br>';
  results +=  'Total Collections obtained: ' + totalCollections  + '<br><br>';

  results +=  'Unobtained collections: (click on link to expand)<br>';

  results +=  '<ul class="mktree">';

  var printOnce = 1;
  var printIntro = 1;

  for (var j=0; j<categoriesMetropolis.length; j++) {
    for (var i=0; i<collectionCollection.length; i++) {
      if (collectionCollection[i].city == "Metropolis") {
        if (collectionCollection[i].category == categoriesMetropolis[j]) {
          if (collectionList[collectionCollection[i].name] < 1) {
            if (printIntro == 1) {
              results += '  <li>Metropolis/';
              results += '    <ul>';
              printIntro = 0;
            }
            if (printOnce == 1) {
              results += '      <li>' + categoriesMetropolis[j] + '/';
              results += '        <ul>';
              printOnce = 2;
            }
            results += '          <li>' + collectionCollection[i].name + '</li>';
          }
        }
      }
    }
    if (printOnce == 2) {
      results += '        </ul>';
      results += '      </li>';
      printOnce = 1;
    }
  }

  if (printIntro == 0) {
    results += '    </ul>';
    results += '  </li>';
    printIntro = 1;
  }

  var categoriesGotham = [ "Big Belly BurgerTime", "Depths of Arkham", "Gotham Central", "Gotham Fans",
                           "Gotham Gazette Guides", "Gotham Meetups", "Gotham Street Signs",
                           "No Man's Land", "Penguin Umbrellas", "Robinson Remembrance",
                           "Stagg Stop Maps", "Technology's Vanguard", "The Joker's Trick Cards",
                           "Vicki Vale Bylines", "WayneTech Watches",
                           "Court Orders", "South Gotham Scraps" ];

  for (var j=0; j<categoriesGotham.length; j++) {
    for (var i=0; i<collectionCollection.length; i++) {
      if (collectionCollection[i].city == "Gotham") {
        if (collectionCollection[i].category == categoriesGotham[j]) {
          if (collectionList[collectionCollection[i].name] < 1) {
            if (printIntro == 1) {
              results += '  <li>Gotham/';
              results += '    <ul>';
              printIntro = 0;
            }
            if (printOnce == 1) {
              results += '      <li>' + categoriesGotham[j] + '/';
              results += '        <ul>';
              printOnce = 2;
            }
            results += '          <li>' + collectionCollection[i].name + '</li>';
          }
        }
      }
    }
    if (printOnce == 2) {
      results += '        </ul>';
      results += '      </li>';
      printOnce = 1;
    }
  }

  if (printIntro == 0) {
    results += '    </ul>';
    results += '  </li>';
    printIntro = 1;
  }

  var categoriesCentralCity = [ "Central City Attractions" ];

  for (var j=0; j<categoriesCentralCity.length; j++) {
    for (var i=0; i<collectionCollection.length; i++) {
      if (collectionCollection[i].city == "Central City") {
        if (collectionCollection[i].category == categoriesCentralCity[j]) {
          if (collectionList[collectionCollection[i].name] < 1) {
            if (printIntro == 1) {
              results += '  <li>Central City/';
              results += '    <ul>';
              printIntro = 0;
            }
            if (printOnce == 1) {
              results += '      <li>' + categoriesCentralCity[j] + '/';
              results += '        <ul>';
              printOnce = 2;
            }
            results += '          <li>' + collectionCollection[i].name + '</li>';
          }
        }
      }
    }
    if (printOnce == 2) {
      results += '        </ul>';
      results += '      </li>';
      printOnce = 1;
    }
  }

  if (printIntro == 0) {
    results += '    </ul>';
    results += '  </li>';
    printIntro = 1;
  }

  var categoriesAlerts = [ "Welcome to Groom Lake", "Volcanic Upheaval", "Rarest of Materials",
                           "Lunar Soil Compounds", "Genetically Modified Maize", "Chemo's Legacy",
                           "Science Squad Experiments", "Ancient Khandaqian Relics" ];

  for (var j=0; j<categoriesAlerts.length; j++) {
    for (var i=0; i<collectionCollection.length; i++) {
      if (collectionCollection[i].city == "Alert") {
        if (collectionCollection[i].category == categoriesAlerts[j]) {
          if (collectionList[collectionCollection[i].name] < 1) {
            if (printIntro == 1) {
              results += '  <li>Alerts/';
              results += '    <ul>';
              printIntro = 0;
            }
            if (printOnce == 1) {
              results += '      <li>' + categoriesAlerts[j] + '/';
              results += '        <ul>';
              printOnce = 2;
            }
            results += '          <li>' + collectionCollection[i].name + '</li>';
          }
        }
      }
    }
    if (printOnce == 2) {
      results += '        </ul>';
      results += '      </li>';
      printOnce = 1;
    }
  }

  if (printIntro == 0) {
    results += '    </ul>';
    results += '  </li>';
    printIntro = 1;
  }

  for (var i=0; i<collectionCollection.length; i++) {
    if (collectionCollection[i].city == "Watchtower") {
      if (collectionList[collectionCollection[i].name] < 1) {
        if (printIntro == 1) {
          results += '  <li>Watchtower/';
          results += '    <ul>';
          printIntro = 0;
        }
        results += '          <li>' + collectionCollection[i].name + '</li>';
      }
    }
  }

  if (printIntro == 0) {
    results += '    </ul>';
    results += '  </li>';
    printIntro = 1;
  }

  for (var i=0; i<collectionCollection.length; i++) {
    if (collectionCollection[i].city == "Hall of Doom") {
      if (collectionList[collectionCollection[i].name] < 1) {
        if (printIntro == 1) {
          results += '  <li>Hall of Doom/';
          results += '    <ul>';
          printIntro = 0;
        }
        results += '          <li>' + collectionCollection[i].name + '</li>';
      }
    }
  }

  if (printIntro == 0) {
    results += '    </ul>';
    results += '  </li>';
    printIntro = 1;
  }

  var categoriesSeasonal = [ "Spiritual Wedding Vow", "Emotional Wedding Vow", "Renewal Wedding Vow",
                             "Classic Wedding Vow", "Four-Leaf Clover", "Seeds of Spring",
                             "Holiday Naughty List", "Holiday Nice List" ];

  for (var j=0; j<categoriesSeasonal.length; j++) {
    for (var i=0; i<collectionCollection.length; i++) {
      if (collectionCollection[i].city == "Event") {
        if (collectionCollection[i].category == categoriesSeasonal[j]) {
          if (collectionList[collectionCollection[i].name] < 1) {
            if (printIntro == 1) {
              results += '  <li>Seasonal/';
              results += '    <ul>';
              printIntro = 0;
            }
            if (printOnce == 1) {
              results += '      <li>' + categoriesSeasonal[j] + '/';
              results += '        <ul>';
              printOnce = 2;
            }
            results += '          <li>' + collectionCollection[i].name + '</li>';
          }
        }
      }
    }
    if (printOnce == 2) {
      results += '        </ul>';
      results += '      </li>';
      printOnce = 1;
    }
  }

  if (printIntro == 0) {
    results += '    </ul>';
    results += '  </li>';
    printIntro = 1;
  }

  results += '</ul>';

  document.getElementById("TableDisplay").innerHTML = results;
  convertTrees();

  document.getElementById('StatsDisplay').style.display="none";
  document.getElementById('TableDisplay').style.display="block";

  document.getElementById('LeftChartDiv').innerHTML = "";
  document.getElementById('RightChartDiv').innerHTML = "";
}

function drawMarksChart(itemTotalPerDay)
{
  var graphData = new google.visualization.DataTable();
  graphData.addColumn('string', 'Date');
  graphData.addColumn('number', 'Triumph');
  graphData.addColumn('number', 'Distinction');
  graphData.addColumn('number', 'Krypton');
  graphData.addColumn('number', 'War');
  graphData.addColumn('number', 'Conquest');
  graphData.addColumn('number', 'Legend');
  graphData.addColumn('number', 'Momentum');
  graphData.addColumn('number', 'Allegiance');
  graphData.addColumn('number', 'Victory');
  graphData.addColumn('number', 'Strategy');
  graphData.addColumn('number', 'Tactics');
  graphData.addColumn('number', 'Lore');

  var sortedArray = arraySortByKeysDate(itemTotalPerDay);

  for (var index in sortedArray) {
    var dateStr = sortedArray[index];
    var triumph     = itemTotalPerDay[sortedArray[index]].triumph;
    var distinction = itemTotalPerDay[sortedArray[index]].distinction;
    var krypton     = itemTotalPerDay[sortedArray[index]].krypton;
    var war         = itemTotalPerDay[sortedArray[index]].war;
    var conquest    = itemTotalPerDay[sortedArray[index]].conquest;
    var legend      = itemTotalPerDay[sortedArray[index]].legend;
    var momentum    = itemTotalPerDay[sortedArray[index]].momentum;
    var allegiance  = itemTotalPerDay[sortedArray[index]].allegiance;
    var victory     = itemTotalPerDay[sortedArray[index]].victory;
    var strategy    = itemTotalPerDay[sortedArray[index]].strategy;
    var tactics     = itemTotalPerDay[sortedArray[index]].tactics;
    var lore        = itemTotalPerDay[sortedArray[index]].lore;
    graphData.addRow([dateStr, triumph, distinction, krypton, war, conquest, legend, momentum, allegiance, victory, strategy, tactics, lore]);
  }

  var options = {
          title: 'Marks gained per day',
          titleTextStyle:
          {
            italics: false,
            fontName: "Times",
            fontStyle: "normal" //or bold, italic, etc.
          }
  };

  var chart = new google.visualization.LineChart(document.getElementById('RightChartDiv'));
  chart.draw(graphData, options);
}


function drawMarksPieChart(triumph, distinction, krypton, war, conquest, legend, momentum, allegiance, victory, tactics, strategy, lore)
{
  var graph_data = new google.visualization.DataTable();
  graph_data.addColumn('string', 'Marks Type');
  graph_data.addColumn('number', 'Count');
  graph_data.addRow(["Triumph", triumph]);
  graph_data.addRow(["Distinction", distinction]);
  graph_data.addRow(["Krypton", krypton]);
  graph_data.addRow(["War", war]);
  graph_data.addRow(["Conquest", conquest]);
  graph_data.addRow(["Legend", legend]);
  graph_data.addRow(["Momentum", momentum]);
  graph_data.addRow(["Allegiance", allegiance]);
  graph_data.addRow(["Victory", victory]);
  graph_data.addRow(["Tactics", tactics]);
  graph_data.addRow(["Strategy", strategy]);
  graph_data.addRow(["Lore", lore]);

  var options = {
          title: 'Marks Distribution',
          'chartArea':{left:15,top:65,width:"100%"}
  };
  var chart = new google.visualization.PieChart(document.getElementById('LeftChartDiv'));
  chart.draw(graph_data, options);
}


// ********************************************************************
// *	calculateMarks
// *	Go through all of log lines and count up how
// *	many of each type of mark the character received
// *	    For example: 1335707427: ClassicFumbles received 2 x Mark of War
// ********************************************************************

function calculateMarks(character, startDateString, endDateString)
{

  // Example of JSON entry for mark:
  //     "Mark":[{"time":"1335027727","item":"1 x Mark of Krypton"}]},

  var totalMarks = 0;
  var marksKrypton = 0;
  var marksTriumph  = 0;
  var marksDistinction = 0;
  var marksAllegiance = 0;
  var marksLegend = 0;
  var marksVictory = 0;
  var marksWar = 0;
  var marksConquest = 0;
  var marksMomentum = 0;
  var marksTactics = 0;
  var marksStrategy = 0;
  var marksLore = 0;
  var maxItemLength = 23;

  var itype = "Marks";
  var typeOfItem = "";
  var timestamp = 0;

  var startTS = convertDateStringToTimestamp(startDateString);
  var endTS = convertDateStringToTimestamp(endDateString);

  var people = [];
  var itemTotalPerDay = {};

  if (character == "All characters") {
    people = Object.keys(allLogLinesJSON);
  }
  else {
    people = [ character ];
  }

  var earliestTS = 0;
  var latestTS = 0;

  people.forEach(function(person) {
    if (typeof(allLogLinesJSON[person]) != "undefined") {
      if (allLogLinesJSON[person].hasOwnProperty(itype)) {
        var itemArray = allLogLinesJSON[person][itype];

        for (var i=0; i<itemArray.length; i++) {
          timestamp = parseFloat(itemArray[i].time);
          if (earliestTS == 0) {
            earliestTS = timestamp;
            latestTS = timestamp;
          }
          else if (timestamp < earliestTS) {
            earliestTS = timestamp;
          }
          else if (timestamp > latestTS) {
            latestTS = timestamp;
          }
        }
      }
    }
  });

  if (earliestTS < startTS) { earliestTS = startTS; }
  if (latestTS > endTS) { latestTS = endTS; }

  for (var i=earliestTS; i<latestTS; i+=86400) {
    var currentDay = convertTimestampToDateString(i);
    itemTotalPerDay[currentDay] = {};
    itemTotalPerDay[currentDay].krypton = 0;
    itemTotalPerDay[currentDay].triumph = 0;
    itemTotalPerDay[currentDay].war = 0;
    itemTotalPerDay[currentDay].distinction = 0;
    itemTotalPerDay[currentDay].allegiance = 0;
    itemTotalPerDay[currentDay].legend = 0;
    itemTotalPerDay[currentDay].victory = 0;
    itemTotalPerDay[currentDay].conquest = 0;
    itemTotalPerDay[currentDay].momentum = 0;
    itemTotalPerDay[currentDay].tactics = 0;
    itemTotalPerDay[currentDay].strategy = 0;
    itemTotalPerDay[currentDay].lore = 0;
  }

  people.forEach(function(person) {

    if (typeof(allLogLinesJSON[person]) != "undefined") {
      if (allLogLinesJSON[person].hasOwnProperty(itype)) {
        var itemArray = allLogLinesJSON[person][itype];

        for (var i=0; i<itemArray.length; i++) {
          timestamp = parseFloat(itemArray[i].time);

          if ((timestamp >= startTS) && (timestamp < endTS)) {
            typeOfItem = itemArray[i].item;
            var marks = parseInt(typeOfItem.charAt(0));

            var currentDay = convertTimestampToDateString(timestamp);
            if (typeof(itemTotalPerDay[currentDay]) == "undefined") {
              itemTotalPerDay[currentDay] = {};
              itemTotalPerDay[currentDay].krypton = 0;
              itemTotalPerDay[currentDay].triumph = 0;
              itemTotalPerDay[currentDay].war = 0;
              itemTotalPerDay[currentDay].distinction = 0;
              itemTotalPerDay[currentDay].allegiance = 0;
              itemTotalPerDay[currentDay].legend = 0;
              itemTotalPerDay[currentDay].victory = 0;
              itemTotalPerDay[currentDay].conquest = 0;
              itemTotalPerDay[currentDay].momentum = 0;
              itemTotalPerDay[currentDay].tactics = 0;
              itemTotalPerDay[currentDay].strategy = 0;
              itemTotalPerDay[currentDay].lore = 0;
            }

            if (typeOfItem.indexOf("Krypton") >= 0)          { marksKrypton += marks; itemTotalPerDay[currentDay].krypton += marks; }
            else if (typeOfItem.indexOf("Triumph") >= 0)     { marksTriumph += marks; itemTotalPerDay[currentDay].triumph += marks; }
            else if (typeOfItem.indexOf("War") >= 0)         { marksWar += marks; itemTotalPerDay[currentDay].war += marks; }
            else if (typeOfItem.indexOf("Distinction") >= 0) { marksDistinction += marks; itemTotalPerDay[currentDay].distinction += marks; }
            else if (typeOfItem.indexOf("Allegiance") >= 0)  { marksAllegiance += marks; itemTotalPerDay[currentDay].allegiance += marks; }
            else if (typeOfItem.indexOf("Legend") >= 0)      { marksLegend += marks; itemTotalPerDay[currentDay].legend += marks; }
            else if (typeOfItem.indexOf("Victory") >= 0)     { marksVictory += marks; itemTotalPerDay[currentDay].victory += marks; }
            else if (typeOfItem.indexOf("Conquest") >= 0)    { marksConquest += marks; itemTotalPerDay[currentDay].conquest += marks; }
            else if (typeOfItem.indexOf("Momentum") >= 0)    { marksMomentum += marks; itemTotalPerDay[currentDay].momentum += marks; }
            else if (typeOfItem.indexOf("Tactics") >= 0)     { marksTactics += marks; itemTotalPerDay[currentDay].tactics += marks; }
            else if (typeOfItem.indexOf("Strategy") >= 0)    { marksStrategy += marks; itemTotalPerDay[currentDay].strategy += marks; }
            else if (typeOfItem.indexOf("Lore") >= 0)        { marksLore += marks; itemTotalPerDay[currentDay].lore += marks; }
            else {
              console.log("ERROR: unknown type of mark: " + typeOfItem);
            }
          }
        }
      }
    }
  });

  totalMarks = (marksStrategy + marksTactics + marksMomentum + marksKrypton + marksTriumph + marksDistinction + marksAllegiance + marksLegend + marksVictory + marksWar + marksConquest + marksLore);

  var Message = "";
  Message += "Character:         " + character + "\r\n";
  Message += "Date range:        " + startDateString + " through " + endDateString + "\r\n\r\n";
  Message += "Total marks:       " + totalMarks + "\r\n\r\n";

  if (totalMarks > 0) {
    if (marksTriumph > 0)     { Message += "Marks of Triumph:     " + marksTriumph + "\r\n"; }
    if (marksDistinction > 0) { Message += "Marks of Distinction: " + marksDistinction + "\r\n"; }
    if (marksKrypton > 0)     { Message += "Marks of Krypton:     " + marksKrypton + "\r\n"; }
    if (marksWar > 0)         { Message += "Marks of War:         " + marksWar + "\r\n"; }
    if (marksLegend > 0)      { Message += "Marks of Legend:      " + marksLegend + "\r\n"; }
    if (marksConquest > 0)    { Message += "Marks of Conquest:    " + marksConquest + "\r\n"; }
    if (marksMomentum > 0)    { Message += "Marks of Momentum:    " + marksMomentum + "\r\n"; }
    if (marksAllegiance > 0)  { Message += "Marks of Allegiance:  " + marksAllegiance + "\r\n"; }
    if (marksVictory > 0)     { Message += "Marks of Victory:     " + marksVictory + "\r\n"; }
    if (marksTactics > 0)     { Message += "Marks of Tactics:     " + marksTactics + "\r\n"; }
    if (marksStrategy > 0)    { Message += "Marks of Strategy:    " + marksStrategy + "\r\n"; }
    if (marksLore > 0)        { Message += "Marks of Lore:        " + marksLore + "\r\n"; }
  }

  Message += "\r\n";
  var sortedArray = arraySortByKeysDate(itemTotalPerDay);

  for (var index in sortedArray) {
    var triumph = itemTotalPerDay[sortedArray[index]].triumph;
    var distinction = itemTotalPerDay[sortedArray[index]].distinction;
    var krypton = itemTotalPerDay[sortedArray[index]].krypton;
    var war = itemTotalPerDay[sortedArray[index]].war;
    var legend = itemTotalPerDay[sortedArray[index]].legend;
    var conquest = itemTotalPerDay[sortedArray[index]].conquest;
    var momentum = itemTotalPerDay[sortedArray[index]].momentum;
    var allegiance = itemTotalPerDay[sortedArray[index]].allegiance;
    var victory = itemTotalPerDay[sortedArray[index]].victory;
    var tactics = itemTotalPerDay[sortedArray[index]].tactics;
    var strategy = itemTotalPerDay[sortedArray[index]].strategy;
    var lore = itemTotalPerDay[sortedArray[index]].lore;

    if (triumph > 0) { Message += printLineDate("Marks of Triumph", triumph, sortedArray[index], maxItemLength); }
    if (distinction > 0) { Message += printLineDate("Marks of Distinction", distinction, sortedArray[index], maxItemLength); }
    if (krypton > 0) { Message += printLineDate("Marks of Krypton", krypton, sortedArray[index], maxItemLength); }
    if (war > 0) { Message += printLineDate("Marks of War", war, sortedArray[index], maxItemLength); }
    if (legend > 0) { Message += printLineDate("Marks of Legend", legend, sortedArray[index], maxItemLength); }
    if (conquest > 0) { Message += printLineDate("Marks of Conquest", conquest, sortedArray[index], maxItemLength); }
    if (momentum > 0) { Message += printLineDate("Marks of Momentum", momentum, sortedArray[index], maxItemLength); }
    if (allegiance > 0) { Message += printLineDate("Marks of Allegiance", allegiance, sortedArray[index], maxItemLength); }
    if (victory > 0) { Message += printLineDate("Marks of Victory", victory, sortedArray[index], maxItemLength); }
    if (tactics > 0) { Message += printLineDate("Marks of Tactics", tactics, sortedArray[index], maxItemLength); }
    if (strategy > 0) { Message += printLineDate("Marks of Strategy", strategy, sortedArray[index], maxItemLength); }
    if (lore > 0) { Message += printLineDate("Marks of Lore", lore, sortedArray[index], maxItemLength); }
  }

  document.getElementById('StatsDisplay').style.display="block";
  document.getElementById('TableDisplay').style.display="none";
  document.getElementById("StatsDisplay").innerHTML = Message;

  drawMarksPieChart(marksTriumph, marksDistinction, marksKrypton, marksWar, marksConquest, marksLegend, marksMomentum, marksAllegiance, marksVictory, marksTactics, marksStrategy, marksLore);
  drawMarksChart(itemTotalPerDay);
}



function drawItemChart(itemTotalPerDay, itemStr) {

  var graphData = new google.visualization.DataTable();
  graphData.addColumn('string', 'Date');
  graphData.addColumn('number', itemStr);

  var sortedArray = arraySortByKeysDate(itemTotalPerDay);

  var counter = 0;
  for (var index in sortedArray) {
    counter += 1;
  }

  // If more than a year's worth of days to graph, aggregate into months instead

  var titleStr = ' obtained per day';

  if (counter > 365) {

    titleStr = ' obtained per month';

    var previousMonthTotal = 0;
    var previousYear = 0;
    var previousMonth = 0;

    for (var index in sortedArray) {
      var dateStr = sortedArray[index];

      // Have to include the radix of 10 as second param to parseint for leading 0 numbers like "01"
      var month = parseInt(dateStr.substring(0, 2), 10);
      var day   = parseInt(dateStr.substring(3, 5), 10) - 1;  // Day is zero based
      var year  = parseInt(dateStr.substring(6, 10));

      var amount = Math.round(itemTotalPerDay[sortedArray[index]]);

      if (previousYear == 0) {
        previousYear = year;
      }
      if (previousMonth == 0) {
        previousMonth = month;
      }

      if ((month == previousMonth) && (year == previousYear)) {
        previousMonthTotal += amount;
      }
      else {
        graphData.addRow([monthArrayShort[previousMonth-1] + " " + previousYear, previousMonthTotal]);
        previousMonthTotal = amount;
        previousYear = year;
        previousMonth = month;
      }
    }
  }
  else {
    for (var index in sortedArray) {
      var amount = Math.round(itemTotalPerDay[sortedArray[index]]);
      graphData.addRow([sortedArray[index], amount]);
    }
  }

  var options = {
          title: itemStr + titleStr
  };

  var chart = new google.visualization.ColumnChart(document.getElementById('RightChartDiv'));
  chart.draw(graphData, options);
}


function drawItemPieChart(itemTotalPerPerson, itemStr)
{
  var graphData = new google.visualization.DataTable();
  graphData.addColumn('string', 'Person');
  graphData.addColumn('number', 'Count');

  for (var character in itemTotalPerPerson) {
    graphData.addRow([character, itemTotalPerPerson[character]]);
  }
  var options = {
          title: 'Distribution',
          'chartArea':{left:15,top:65,width:"100%"}
  };
  var chart = new google.visualization.PieChart(document.getElementById('LeftChartDiv'));
  chart.draw(graphData, options);
}


// ********************************************************************
// *	calculateCash
// *	Go through the recordset of log lines and count up how
// *	much gained cash the character received
// *	    Log line will look like:
// *             1335027320: ClassicFumbles gained 7499 cash
// *        JSON will look like:
// *            "Cash":[{"time":"04/21/2012","item":3800}],
// ********************************************************************

function calculateCash(character, startDateString, endDateString)
{
  var itype = "Cash";
  var totalCash = 0.0;
  var maxItemLength = 13;

  var startTS = convertDateStringToTimestamp(startDateString);
  var endTS = convertDateStringToTimestamp(endDateString);

  var people = [];
  var itemTotalPerDay = {};
  var itemTotalPerPerson = {};

  if (character == "All characters") {
    people = Object.keys(allLogLinesJSON);
  }
  else {
    people = [ character ];
  }

  var earliestTS = 0;
  var latestTS = 0;

  people.forEach(function(person) {
    if (typeof(allLogLinesJSON[person]) != "undefined") {
      if (allLogLinesJSON[person].hasOwnProperty(itype)) {
        var itemArray = allLogLinesJSON[person][itype];

        for (var i=0; i<itemArray.length; i++) {
          var timestamp = parseFloat(itemArray[i].time);
          if (earliestTS == 0) {
            earliestTS = timestamp;
            latestTS = timestamp;
          }
          else if (timestamp < earliestTS) {
            earliestTS = timestamp;
          }
          else if (timestamp > latestTS) {
            latestTS = timestamp;
          }
        }
      }
    }
  });

  if (earliestTS < startTS) { earliestTS = startTS; }
  if (latestTS > endTS) { latestTS = endTS; }

  for (var i=earliestTS; i<latestTS; i+=86400) {
    var currentDay = convertTimestampToDateString(i);
    itemTotalPerDay[currentDay] = 0;
  }

  people.forEach(function(person) {
    if (typeof(allLogLinesJSON[person]) != "undefined") {
      if (allLogLinesJSON[person].hasOwnProperty(itype)) {
        var itemArray = allLogLinesJSON[person][itype];

        for (var i=0; i<itemArray.length; i++) {
          var currentDay = itemArray[i].time;
          var currentDayTimestamp = convertDateStringToTimestamp(currentDay);

          if ((currentDayTimestamp >= startTS) && (currentDayTimestamp < endTS)) {
            var cash = parseFloat(itemArray[i].item);

            if (typeof(itemTotalPerDay[currentDay]) == "undefined") {
              itemTotalPerDay[currentDay] = cash;
            }
            else {
              itemTotalPerDay[currentDay] += cash;
            }
            if (typeof(itemTotalPerPerson[person]) == "undefined") {
              itemTotalPerPerson[person] = cash;
            }
            else {
              itemTotalPerPerson[person] += cash;
            }
            totalCash += cash;
          }
        }
      }
    }
  });

  var Message = "";
  Message += "Character:         " + character + "\r\n";
  Message += "Date range:        " + startDateString + " through " + endDateString + "\r\n\r\n";
  Message += "Total cash:        " + totalCash.formatMoney(0, '.', ',') + "\r\n\r\n";
  Message += "Cash".lpad(" ", 12) + "\t Date gained\r\n";

  var sortedArray = arraySortByKeysDate(itemTotalPerDay);
  for (var index in sortedArray) {
    Message += printLineCash(sortedArray[index], itemTotalPerDay[sortedArray[index]], " ", maxItemLength);
  }

  document.getElementById('StatsDisplay').style.display="block";
  document.getElementById('TableDisplay').style.display="none";
  document.getElementById("StatsDisplay").innerHTML = Message;
  drawItemChart(itemTotalPerDay, itype);
  drawItemPieChart(itemTotalPerPerson, itype);
}



function drawDamageChart(damageTotalPerDay, critDamageTotalPerDay, itemStr) {

  var graphData = new google.visualization.DataTable();
  graphData.addColumn('string', 'Date');
  graphData.addColumn('number', "Damage");
  graphData.addColumn('number', "Critical Damage");

  var sortedArray = arraySortByKeysDate(damageTotalPerDay);

  var counter = 0;
  for (var index in sortedArray) {
    counter += 1;
  }

  // If more than a year's worth of days to graph, aggregate into months instead

  var titleStr = ' dealt per day';

  if (counter > 365) {

    titleStr = ' dealt per month';

    var previousMonthTotal = 0;
    var previousMonthTotal2 = 0;
    var previousYear = 0;
    var previousMonth = 0;

    for (var index in sortedArray) {
      var dateStr = sortedArray[index];

      // Have to include the radix of 10 as second param to parseint for leading 0 numbers like "01"
      var month = parseInt(dateStr.substring(0, 2), 10);
      var day   = parseInt(dateStr.substring(3, 5), 10) - 1;  // Day is zero based
      var year  = parseInt(dateStr.substring(6, 10));

      var amount2 = 0;
      var amount = Math.round(damageTotalPerDay[sortedArray[index]]);
      if (typeof(critDamageTotalPerDay[sortedArray[index]]) != "undefined") {
        amount2 = Math.round(critDamageTotalPerDay[sortedArray[index]]);
      }

      if (previousYear == 0) {
        previousYear = year;
      }
      if (previousMonth == 0) {
        previousMonth = month;
      }

      if ((month == previousMonth) && (year == previousYear)) {
        previousMonthTotal += amount;
        previousMonthTotal2 += amount2;
      }
      else {
        graphData.addRow([monthArrayShort[previousMonth-1] + " " + previousYear, previousMonthTotal, previousMonthTotal2]);
        previousMonthTotal = amount;
        previousMonthTotal2 = amount2;
        previousYear = year;
        previousMonth = month;
      }
    }
  }
  else {
    for (var index in sortedArray) {
      var amount2 = 0;
      var amount = Math.round(damageTotalPerDay[sortedArray[index]]);
      if (typeof(critDamageTotalPerDay[sortedArray[index]]) != "undefined") {
        amount2 = Math.round(critDamageTotalPerDay[sortedArray[index]]);
      }
      graphData.addRow([sortedArray[index], amount, amount2]);
    }
  }

  var options = {
          title: itemStr + titleStr
  };

  var chart = new google.visualization.ColumnChart(document.getElementById('RightChartDiv'));
  chart.draw(graphData, options);


}


function calculateDamage(character, startDateString, endDateString)
{
  var itype = "Damage";
  var itype2 = "CritDamage";
  var totalDamage = 0.0;
  var maxItemLength = 13;

  var startTS = convertDateStringToTimestamp(startDateString);
  var endTS = convertDateStringToTimestamp(endDateString);

  var people = [];
  var damageTotalPerDay = {};
  var damageTotalPerPerson = {};
  var critdamageTotalPerDay = {};
  var critdamageTotalPerPerson = {};

  if (character == "All characters") {
    people = Object.keys(allLogLinesJSON);
  }
  else {
    people = [ character ];
  }

  people.forEach(function(person) {
    if (typeof(allLogLinesJSON[person]) != "undefined") {
      if (allLogLinesJSON[person].hasOwnProperty(itype)) {
        var itemArray = allLogLinesJSON[person][itype];

        for (var i=0; i<itemArray.length; i++) {
          var currentDay = itemArray[i].time;
          var currentDayTimestamp = convertDateStringToTimestamp(currentDay);

          if ((currentDayTimestamp >= startTS) && (currentDayTimestamp < endTS)) {
            var damage = parseFloat(itemArray[i].item);

            if (typeof(damageTotalPerDay[currentDay]) == "undefined") {
              damageTotalPerDay[currentDay] = damage;
            }
            else {
              damageTotalPerDay[currentDay] += damage;
            }
            if (typeof(damageTotalPerPerson[person]) == "undefined") {
              damageTotalPerPerson[person] = damage;
            }
            else {
              damageTotalPerPerson[person] += damage;
            }
            totalDamage += damage;
          }
        }
      }
      if (allLogLinesJSON[person].hasOwnProperty(itype2)) {
        var itemArray = allLogLinesJSON[person][itype2];

        for (var i=0; i<itemArray.length; i++) {
          var currentDay = itemArray[i].time;
          var currentDayTimestamp = convertDateStringToTimestamp(currentDay);

          if ((currentDayTimestamp >= startTS) && (currentDayTimestamp < endTS)) {
            var damage = parseFloat(itemArray[i].item);

            if (typeof(critdamageTotalPerDay[currentDay]) == "undefined") {
              critdamageTotalPerDay[currentDay] = damage;
            }
            else {
              critdamageTotalPerDay[currentDay] += damage;
            }
            if (typeof(critdamageTotalPerPerson[person]) == "undefined") {
              critdamageTotalPerPerson[person] = damage;
            }
            else {
              critdamageTotalPerPerson[person] += damage;
            }
            totalDamage += damage;
          }
        }
      }
    }
  });

  var Message = "";
  Message += "Character:         " + character + "\r\n";
  Message += "Date range:        " + startDateString + " through " + endDateString + "\r\n\r\n";
  Message += "Total damage:      " + totalDamage + "\r\n\r\n";

  Message += "Damage:\r\n\r\n";
  var sortedArray = arraySortByKeys(damageTotalPerDay);
  for (var index in sortedArray) {
    Message += printLineCash(sortedArray[index], damageTotalPerDay[sortedArray[index]], " ", maxItemLength);
  }
  Message += "\r\nCritical Damage:\r\n\r\n";
  var sortedArray = arraySortByKeys(critdamageTotalPerDay);
  for (var index in sortedArray) {
    Message += printLineCash(sortedArray[index], critdamageTotalPerDay[sortedArray[index]], " ", maxItemLength);
  }

  document.getElementById('StatsDisplay').style.display="block";
  document.getElementById('TableDisplay').style.display="none";
  document.getElementById("StatsDisplay").innerHTML = Message;
  drawDamageChart(damageTotalPerDay, critdamageTotalPerDay, itype);

  // Too many people recording damage to stick them all in a pie chart.  Only get top 9
  var top9damageTotalPerPerson = {};
  var sortedArray = sortByValue(damageTotalPerPerson);

  var lastOne = sortedArray.length-9;
  if (lastOne < 0) {
    lastOne = 0;
  }
  for (var i = sortedArray.length-1; i > lastOne; i--) {
    var key = sortedArray[i][0];
    // var value = sortedArray[i][1];
    top9damageTotalPerPerson[key] = damageTotalPerPerson[key];
  }
  drawItemPieChart(top9damageTotalPerPerson, itype);
}


function calculateDamagePowers(character, startDateString, endDateString)
{
  var itype = "DamagePowers";
  var totalDamage = 0.0;
  var maxItemLength = 13;
  var listMessage = "";

  var startTS = convertDateStringToTimestamp(startDateString);
  var endTS = convertDateStringToTimestamp(endDateString);

  var people = [];
  var damageTotalPerTS = {};

  if (character == "All characters") {
    people = Object.keys(allLogLinesJSON);
  }
  else {
    people = [ character ];
  }

  var minTimestamp = 9337652552;
  var maxTimestamp = 0;

  people.forEach(function(person) {
    if (allLogLinesJSON[person].hasOwnProperty(itype)) {
      var damageObj = Object.keys(allLogLinesJSON[person][itype]);
      damageObj.forEach(function(power) {
        var powerArray = allLogLinesJSON[person][itype][power];
        for (var i=0; i<powerArray.length; i++) {
          listMessage += power + "\t" + powerArray[i].time + "\t" + powerArray[i].damage + "\r\n";
          if (powerArray[i].time < minTimestamp) {
            minTimestamp = powerArray[i].time;
          }
          if (powerArray[i].time > maxTimestamp) {
            maxTimestamp = powerArray[i].time;
          }
        }
      });
    }
  });

  var Message = "";
  Message += "Character:         " + character + "\r\n";
  Message += "Date range:        " + startDateString + " through " + endDateString + "\r\n\r\n";
  Message += "Total damage:      " + totalDamage + "\r\n\r\n";

  Message += listMessage;

  document.getElementById('StatsDisplay').style.display="block";
  document.getElementById('TableDisplay').style.display="none";
  document.getElementById("StatsDisplay").innerHTML = Message;
}


function drawLockboxContentsPieChart(consumable, ring, neck, gear) {

  var box2_data = new google.visualization.DataTable();
  box2_data.addColumn('string', 'Lockboxes');
  box2_data.addColumn('number', 'Count');

  box2_data.addRow(["Consumables", consumable]);
  box2_data.addRow(["Rings", ring]);
  box2_data.addRow(["Necks", neck]);
  box2_data.addRow(["Gear", gear]);

  var options = {
          title: 'Lockbox contents',
          'chartArea':{left:15,top:65,width:"100%"}
  };

  var chart = new google.visualization.PieChart(document.getElementById('LeftChartDiv'));
  chart.draw(box2_data, options);
}


// ********************************************************************
// *	calculateLockboxes
// *	Go through all of log lines and count up how
// *	many of each type of lockbox the character received
// *	    For example: 1335712642: ClassicFumbles received Compound ATK-04
// ********************************************************************

function calculateLockboxes(character, startDateString, endDateString)
{
  var itype = "Lockbox";
  var totalLockboxes = 0;
  var totalLockboxesGotten = 0;
  var totalLockboxConsumables = 0;
  var totalLockboxRings = 0;
  var totalLockboxNecks = 0;
  var totalLockboxGear = 0;
  var timestamp = 0;
  var listMessage = "";
  var maxItemLength = 50;

  var startTS = convertDateStringToTimestamp(startDateString);
  var endTS = convertDateStringToTimestamp(endDateString);

  var people = [];
  var itemTotalPerDay = {};
  var lockboxList = new Array();

  if (character == "All characters") {
    people = Object.keys(allLogLinesJSON);
  }
  else {
    people = [ character ];
  }

  // Let's figure out the date ranges we will be displaying in the graph
  //    and zero them all out so we can display dates with 0 lockboxes
  // First, lets get the start and end date ranges according to the actual data

  // I could just use startTS and endTS but by default that is over two years worth of days

  var earliestTS = 0;
  var latestTS = 0;

  people.forEach(function(person) {
    if (typeof(allLogLinesJSON[person]) != "undefined") {
      if (allLogLinesJSON[person].hasOwnProperty(itype)) {
        var itemArray = allLogLinesJSON[person][itype];

        for (var i=0; i<itemArray.length; i++) {
          timestamp = parseFloat(itemArray[i].time);
          if (earliestTS == 0) {
            earliestTS = timestamp;
            latestTS = timestamp;
          }
          else if (timestamp < earliestTS) {
            earliestTS = timestamp;
          }
          else if (timestamp > latestTS) {
            latestTS = timestamp;
          }
        }
      }
    }
  });

  if (earliestTS < startTS) { earliestTS = startTS; }
  if (latestTS > endTS) { latestTS = endTS; }

  for (var i=earliestTS; i<latestTS; i+=86400) {
    var currentDay = convertTimestampToDateString(i);
    itemTotalPerDay[currentDay] = 0;
  }

  people.forEach(function(person) {
    if (typeof(allLogLinesJSON[person]) != "undefined") {
      if (allLogLinesJSON[person].hasOwnProperty(itype)) {
        var itemArray = allLogLinesJSON[person][itype];

        for (var i=0; i<itemArray.length; i++) {
          timestamp = parseFloat(itemArray[i].time);

          if ((timestamp >= startTS) && (timestamp < endTS)) {

            // Count total lockboxes received even unopened ones
            if (itemArray[i].item == "Promethium Lockbox") {
              totalLockboxesGotten++;
            }
            // Now work on opened lockboxes
            else {
              lockboxList.push({item:itemArray[i].item, time:timestamp, character:person});
              if (isLockboxConsumable(itemArray[i].item)) { totalLockboxConsumables += 1; }
              else if (isLockboxRing(itemArray[i].item)) { totalLockboxRings += 1; }
              else if (isLockboxNeck(itemArray[i].item)) { totalLockboxNecks += 1; }
              else if (isLockboxGear(itemArray[i].item)) { totalLockboxGear += 1; }
              totalLockboxes += 1;
              var currentDay = convertTimestampToDateString(timestamp);
              if (typeof(itemTotalPerDay[currentDay]) == "undefined") {
                itemTotalPerDay[currentDay] = 1;
              }
              else {
                itemTotalPerDay[currentDay] += 1;
              }
            }
          }
        }
      }
    }
  });

  var Message = "";
  Message += "Character:         " + character + "\r\n";
  Message += "Date range:        " + startDateString + " through " + endDateString + "\r\n\r\n";
  Message += "Total Lockboxes obtained: " + totalLockboxesGotten + "\r\n";
  Message += "Total Lockboxes opened:   " + totalLockboxes + "\r\n\r\n";
  Message += "Lockbox contents".rpad(" ", maxItemLength) + "\tDate received\tCharacter\r\n\r\n";

  lockboxList.sort(function(x, y){
    return x.time - y.time;
  })

  for (var i = 0; i < lockboxList.length; i++) {
    listMessage += printLineDate(lockboxList[i].item, convertTimestampToDateString(lockboxList[i].time), lockboxList[i].character, maxItemLength);
  }

  Message += listMessage;

  document.getElementById('StatsDisplay').style.display="block";
  document.getElementById('TableDisplay').style.display="none";

  document.getElementById("StatsDisplay").innerHTML = Message;

  drawLockboxContentsPieChart(totalLockboxConsumables, totalLockboxRings, totalLockboxNecks, totalLockboxGear);
  drawItemChart(itemTotalPerDay, itype);
}




// ********************************************************************
// *	calculateKnockouts
// ********************************************************************

function calculateKnockouts(character, startDateString, endDateString)
{
  var itype = "Knockouts";
  var totalKnockouts = 0;
  var timestamp = 0;
  var listMessage = "";
  var maxItemLength = 50;

  var startTS = convertDateStringToTimestamp(startDateString);
  var endTS = convertDateStringToTimestamp(endDateString);

  var people = [];
  var itemTotalPerDay = {};
  var itemTotalPerPerson = {};

  if (character == "All characters") {
    people = Object.keys(allLogLinesJSON);
  }
  else {
    people = [ character ];
  }

  var earliestTS = 0;
  var latestTS = 0;

  people.forEach(function(person) {
    if (typeof(allLogLinesJSON[person]) != "undefined") {
      if (allLogLinesJSON[person].hasOwnProperty(itype)) {
        var itemArray = allLogLinesJSON[person][itype];

        for (var i=0; i<itemArray.length; i++) {
          timestamp = parseFloat(itemArray[i].time);
          if (earliestTS == 0) {
            earliestTS = timestamp;
            latestTS = timestamp;
          }
          else if (timestamp < earliestTS) {
            earliestTS = timestamp;
          }
          else if (timestamp > latestTS) {
            latestTS = timestamp;
          }
        }
      }
    }
  });

  if (earliestTS < startTS) { earliestTS = startTS; }
  if (latestTS > endTS) { latestTS = endTS; }

  for (var i=earliestTS; i<latestTS; i+=86400) {
    var currentDay = convertTimestampToDateString(i);
    itemTotalPerDay[currentDay] = 0;
  }

  people.forEach(function(person) {
    if (typeof(allLogLinesJSON[person]) != "undefined") {
      if (allLogLinesJSON[person].hasOwnProperty(itype)) {
        var itemArray = allLogLinesJSON[person][itype];

        for (var i=0; i<itemArray.length; i++) {
          timestamp = parseFloat(itemArray[i].time);

          if ((timestamp >= startTS) && (timestamp < endTS)) {
            var currentDay = convertTimestampToDateString(timestamp);

            if (typeof(itemTotalPerDay[currentDay]) == "undefined") {
              itemTotalPerDay[currentDay] = 1;
            }
            else {
              itemTotalPerDay[currentDay] += 1;
            }
            // Here we will keep track of how many times I knocked out a specific thing, like Reaper 100 times
            //    then use this for pie chart
            if (typeof(itemTotalPerPerson[itemArray[i].item]) == "undefined") {
              itemTotalPerPerson[itemArray[i].item] = 1;
            }
            else {
              itemTotalPerPerson[itemArray[i].item] += 1;
            }

            listMessage += printLineDate(itemArray[i].item, convertTimestampToDateString(timestamp), person, maxItemLength);
            totalKnockouts += 1;
          }
        }
      }
    }
  });

  var Message = "";
  Message += "Character:         " + character + "\r\n";
  Message += "Date range:        " + startDateString + " through " + endDateString + "\r\n\r\n";
  Message += "Total Knockouts:   " + totalKnockouts + "\r\n\r\n";
  Message += listMessage;
  document.getElementById('StatsDisplay').style.display="block";
  document.getElementById('TableDisplay').style.display="none";
  document.getElementById("StatsDisplay").innerHTML = Message;
  drawItemChart(itemTotalPerDay, itype);

  // Too many knockouts to stick them all in a pie chart.  Only get top 9
  var top9knockoutsTotalPerPerson = {};
  var sortedArray = sortByValue(itemTotalPerPerson);

  var lastOne = sortedArray.length-9;
  if (lastOne < 0) {
    lastOne = 0;
  }
  for (var i = sortedArray.length-1; i > lastOne; i--) {
    var key = sortedArray[i][0];
    // var value = sortedArray[i][1];
    top9knockoutsTotalPerPerson[key] = itemTotalPerPerson[key];
  }
  drawItemPieChart(top9knockoutsTotalPerPerson, itype);
}


function isPlanSoder(planStr)
{
  if ((planStr.indexOf("Soder")       >= 0) ||
      (planStr.indexOf("Grenade")     >= 0) ||
      (planStr.indexOf("Sport Drink") >= 0) ||
      (planStr.indexOf("PvP Debuff")  >= 0)) {
    return true;
  }
  return false;
}


// ********************************************************************
// *	calculatePlans
// *	Go through all of log lines and count up how
// *	many of each type of Plan the character received
// *	    For example: 1335707550: LoVeR BaBy received Plans: Energy Soder Mk IV
// ********************************************************************

function calculatePlans(character, startDateString, endDateString)
{
  var itype = "Plans";
  var totalPlans = 0;
  var timestamp = 0;
  var listMessage = "";
  var maxItemLength = 50;

  var startTS = convertDateStringToTimestamp(startDateString);
  var endTS = convertDateStringToTimestamp(endDateString);

  var people = [];
  var itemTotalPerDay = {};
  var itemTotalPerPerson = {};

  if (character == "All characters") {
    people = Object.keys(allLogLinesJSON);
  }
  else {
    people = [ character ];
  }

  var earliestTS = 0;
  var latestTS = 0;

  people.forEach(function(person) {
    if (typeof(allLogLinesJSON[person]) != "undefined") {
      if (allLogLinesJSON[person].hasOwnProperty(itype)) {
        var itemArray = allLogLinesJSON[person][itype];

        for (var i=0; i<itemArray.length; i++) {
          timestamp = parseFloat(itemArray[i].time);
          if (earliestTS == 0) {
            earliestTS = timestamp;
            latestTS = timestamp;
          }
          else if (timestamp < earliestTS) {
            earliestTS = timestamp;
          }
          else if (timestamp > latestTS) {
            latestTS = timestamp;
          }
        }
      }
    }
  });

  if (earliestTS < startTS) { earliestTS = startTS; }
  if (latestTS > endTS) { latestTS = endTS; }

  for (var i=earliestTS; i<latestTS; i+=86400) {
    var currentDay = convertTimestampToDateString(i);
    itemTotalPerDay[currentDay] = 0;
  }

  var planType = [];
  planType[0] = "Alpha";
  planType[1] = "Beta";
  planType[2] = "I";
  planType[3] = "II";
  planType[4] = "III";
  planType[5] = "IV";
  planType[6] = "Soder";

  people.forEach(function(person) {
    if (typeof(allLogLinesJSON[person]) != "undefined") {
      if (allLogLinesJSON[person].hasOwnProperty(itype)) {
        var itemArray = allLogLinesJSON[person][itype];

        for (var i=0; i<itemArray.length; i++) {
          timestamp = parseFloat(itemArray[i].time);

          if ((timestamp >= startTS) && (timestamp < endTS)) {
            var currentDay = convertTimestampToDateString(timestamp);
            if (typeof(itemTotalPerDay[currentDay]) == "undefined") {
              itemTotalPerDay[currentDay] = 1;
            }
            else {
              itemTotalPerDay[currentDay] += 1;
            }

            // Loop thru plans backwards so we don't see Plan I when it is actually Plan II
            if (isPlanSoder(itemArray[i].item)) {
              if (typeof(itemTotalPerPerson[planType[6]]) == "undefined") {
                itemTotalPerPerson[planType[6]] = 1;
              }
              else {
                itemTotalPerPerson[planType[6]] += 1;
              }
            }
            else {
              for (var j=planType.length-2; j>=0; j--) {
                if (itemArray[i].item.indexOf(planType[j]) > 0) {
                  if (typeof(itemTotalPerPerson[planType[j]]) == "undefined") {
                    itemTotalPerPerson[planType[j]] = 1;
                  }
                  else {
                    itemTotalPerPerson[planType[j]] += 1;
                  }
                  // If found, don't check any more plan types for this plan item
                  break;
                }
              }
            }
            listMessage += printLineDate(itemArray[i].item, convertTimestampToDateString(timestamp), person, maxItemLength);
            totalPlans += 1;
          }
        }
      }
    }
  });

  var Message = "";
  Message += "Character:         " + character + "\r\n";
  Message += "Date range:        " + startDateString + " through " + endDateString + "\r\n\r\n";
  Message += "Total Plans:       " + totalPlans + "\r\n\r\n";
  Message += "Plan".rpad(" ", maxItemLength) + "\tDate received\tCharacter\r\n\r\n";
  Message += listMessage;
  document.getElementById('StatsDisplay').style.display="block";
  document.getElementById('TableDisplay').style.display="none";
  document.getElementById("StatsDisplay").innerHTML = Message;
  drawItemChart(itemTotalPerDay, itype);
  drawItemPieChart(itemTotalPerPerson, itype);
}



// ********************************************************************
// *	calculateWeapons
// ********************************************************************

function calculateWeapons(character, startDateString, endDateString)
{
  var itype = "Weapon";
  var totalWeapons = 0;
  var timestamp = 0;
  var listMessage = "";
  var maxItemLength = 50;

  var startTS = convertDateStringToTimestamp(startDateString);
  var endTS = convertDateStringToTimestamp(endDateString);

  var people = [];
  var itemTotalPerDay = {};
  var itemTotalPerType = {};

  if (character == "All characters") {
    people = Object.keys(allLogLinesJSON);
  }
  else {
    people = [ character ];
  }

  var earliestTS = 0;
  var latestTS = 0;

  people.forEach(function(person) {
    if (typeof(allLogLinesJSON[person]) != "undefined") {
      if (allLogLinesJSON[person].hasOwnProperty(itype)) {
        var itemArray = allLogLinesJSON[person][itype];

        for (var i=0; i<itemArray.length; i++) {
          timestamp = parseFloat(itemArray[i].time);
          if (earliestTS == 0) {
            earliestTS = timestamp;
            latestTS = timestamp;
          }
          else if (timestamp < earliestTS) {
            earliestTS = timestamp;
          }
          else if (timestamp > latestTS) {
            latestTS = timestamp;
          }
        }
      }
    }
  });

  if (earliestTS < startTS) { earliestTS = startTS; }
  if (latestTS > endTS) { latestTS = endTS; }

  for (var i=earliestTS; i<latestTS; i+=86400) {
    var currentDay = convertTimestampToDateString(i);
    itemTotalPerDay[currentDay] = 0;
  }

  var weaponType = [];
  weaponType[0] = "Bow";
  weaponType[1] = "Brawling";
  weaponType[2] = "Dual Pistol";
  weaponType[3] = "Dual Wield";
  weaponType[4] = "Hand Blaster";
  weaponType[5] = "Martial Arts";
  weaponType[6] = "One-Handed";
  weaponType[7] = "Two-Handed";
  weaponType[8] = "Rifle";
  weaponType[9] = "Staff";

  for (var i=0; i<weaponType.length; i++) {
    itemTotalPerType[weaponType[i]] = 0;
  }

  people.forEach(function(person) {
    if (typeof(allLogLinesJSON[person]) != "undefined") {
      if (allLogLinesJSON[person].hasOwnProperty(itype)) {
        var itemArray = allLogLinesJSON[person][itype];

        for (var i=0; i<itemArray.length; i++) {
          timestamp = parseFloat(itemArray[i].time);

          if ((timestamp >= startTS) && (timestamp < endTS)) {
            var currentDay = convertTimestampToDateString(timestamp);
            if (typeof(itemTotalPerDay[currentDay]) == "undefined") {
              itemTotalPerDay[currentDay] = 1;
            }
            else {
              itemTotalPerDay[currentDay] += 1;
            }
            var dps = 0;
            var foundOne = 0;

            for (var j=0; j<weaponCollection.length; j++) {
              if (itemArray[i].item == weaponCollection[j].name) {
                foundOne = 1;
                itemTotalPerType[weaponCollection[j].type] += 1;
                dps = weaponCollection[j].dps;
                break;
              }
            }
            if (foundOne == 0) {
              console.log("Unknown weapon: " + itemArray[i].item);
            }
            listMessage += itemArray[i].item.rpad(" ", maxItemLength) + "\t" + dps + "\t" + convertTimestampToDateString(timestamp) + "\t" + person + "\r\n";
            totalWeapons += 1;
          }
        }
      }
    }
  });

  var Message = "";
  Message += "Character:         " + character + "\r\n";
  Message += "Date range:        " + startDateString + " through " + endDateString + "\r\n\r\n";
  Message += "Total Weapons:     " + totalWeapons + "\r\n\r\n";
  Message += "Weapon".rpad(" ", maxItemLength) + "\tDPS\tDate received\tCharacter\r\n\r\n";
  Message += listMessage;
  document.getElementById('StatsDisplay').style.display="block";
  document.getElementById('TableDisplay').style.display="none";
  document.getElementById("StatsDisplay").innerHTML = Message;
  drawItemChart(itemTotalPerDay, itype);
  drawItemPieChart(itemTotalPerType, itype);

}


function drawTimeChart(dayCount) {

  var graphData = new google.visualization.DataTable();
  graphData.addColumn('string', 'Date');
  graphData.addColumn('number', 'Hours');

  var sortedArray = arraySortByKeysDate(dayCount);

  var counter = 0;
  for (var index in sortedArray) {
    counter += 1;
  }

  // If more than a year's worth of days to graph, aggregate into months instead

  var titleStr = 'Hours Spent on DCUO per day';

  if (counter > 365) {

    titleStr = 'Hours Spent on DCUO per month';

    var previousMonthTotal = 0;
    var previousYear = 0;
    var previousMonth = 0;

    for (var index in sortedArray) {
      var dateStr = sortedArray[index];

      // Have to include the radix of 10 as second param to parseint for leading 0 numbers like "01"
      var month = parseInt(dateStr.substring(0, 2), 10);
      var day   = parseInt(dateStr.substring(3, 5), 10) - 1;  // Day is zero based
      var year  = parseInt(dateStr.substring(6, 10));

      var hours = Math.round(dayCount[sortedArray[index]] / 3600);

      if (previousYear == 0) {
        previousYear = year;
      }
      if (previousMonth == 0) {
        previousMonth = month;
      }

      if ((month == previousMonth) && (year == previousYear)) {
        previousMonthTotal += hours;
      }
      else {
        graphData.addRow([monthArrayShort[previousMonth-1] + " " + previousYear, previousMonthTotal]);
        previousMonthTotal = hours;
        previousYear = year;
        previousMonth = month;
      }
    }
  }
  else {
    for (var index in sortedArray) {
       var hours = Math.round(dayCount[sortedArray[index]] / 3600);
       graphData.addRow([sortedArray[index], hours]);
    }
  }

  var options = {
          title: titleStr
  };

  var chart = new google.visualization.ColumnChart(document.getElementById('RightChartDiv'));
  chart.draw(graphData, options);
}


function drawTimePieChart(daysObj) {

  var graphData = new google.visualization.DataTable();
  graphData.addColumn('string', 'Weekday');
  graphData.addColumn('number', 'Count');

  graphData.addRow(["Sunday",    daysObj["Sunday"]]);
  graphData.addRow(["Monday",    daysObj["Monday"]]);
  graphData.addRow(["Tuesday",   daysObj["Tuesday"]]);
  graphData.addRow(["Wednesday", daysObj["Wednesday"]]);
  graphData.addRow(["Thursday",  daysObj["Thursday"]]);
  graphData.addRow(["Friday",    daysObj["Friday"]]);
  graphData.addRow(["Saturday",  daysObj["Saturday"]]);

  var options = {
          title: 'Weekday Time Distribution',
          'chartArea':{left:15,top:65,width:"100%"}
  };

  var chart = new google.visualization.PieChart(document.getElementById('LeftChartDiv'));
  chart.draw(graphData, options);
}

// ********************************************************************
// *	calculateTime
// *	Go through all of log lines and count up how
// *	much time the Character was active in DCUO
// ********************************************************************

function calculateTime(character, startDateString, endDateString)
{
  var timestamp = 0;
  var totalTimeForAll = 0;
  var tenMinuteLogTimeout = 600
  var timeListMessage = "";

  var current_day = ""
  var current_hour = ""
  var timestamp_start = 0
  var hours = 0
  var previous_timestamp = 0

  var itemTotalPerDay = {};

  var startTS = convertDateStringToTimestamp(startDateString);
  var endTS = convertDateStringToTimestamp(endDateString);

  var people = [];
  var maxItemLength = 50;

  if (character == "All characters") {
    people = Object.keys(allLogLinesJSON);
  }
  else {
    people = [ character ];
  }

  var earliestTS = 0;
  var latestTS = 0;

  people.forEach(function(person) {
    if (typeof(allLogLinesJSON[person]) != "undefined") {
      if (allLogLinesJSON[person].hasOwnProperty(itype)) {
        var itemArray = allLogLinesJSON[person][itype];

        for (var i=0; i<itemArray.length; i++) {
          timestamp = parseFloat(itemArray[i].time);
          if (earliestTS == 0) {
            earliestTS = timestamp;
            latestTS = timestamp;
          }
          else if (timestamp < earliestTS) {
            earliestTS = timestamp;
          }
          else if (timestamp > latestTS) {
            latestTS = timestamp;
          }
        }
      }
    }
  });

  if (earliestTS < startTS) { earliestTS = startTS; }
  if (latestTS > endTS) { latestTS = endTS; }

  for (var i=earliestTS; i<latestTS; i+=86400) {
    var currentDay = convertTimestampToDateString(i);
    itemTotalPerDay[currentDay] = 0;
  }


  // Have an object for every character which contains an array of their timestamps
  var associativeArray = {};

  // Have a collection of times spent on Mondays, Tuesdays, etc
  var dayOfWeekTotal = {};
  dayOfWeekTotal["Sunday"] = 0;
  dayOfWeekTotal["Monday"] = 0;
  dayOfWeekTotal["Tuesday"] = 0;
  dayOfWeekTotal["Wednesday"] = 0;
  dayOfWeekTotal["Thursday"] = 0;
  dayOfWeekTotal["Friday"] = 0;
  dayOfWeekTotal["Saturday"] = 0;

  // Initialize this to empty arrays
  people.forEach(function(person) {
    associativeArray[person] = {};
    associativeArray[person].timestamps = [];
  });

  var lineArray = [];
  var timeDiff = 0;
  // We don't have an itype for time, every itype includes time
  //   let's just use knockout data to find a start and stop timestamp for graph below

  var itype = "Knockouts";

  // Fill each characters timestamp array with their timestamps
  people.forEach(function(person) {
    var itemtypes = Object.keys(allLogLinesJSON[person]);
    itemtypes.forEach(function(itype) {
      lineArray = allLogLinesJSON[person][itype];
      for (var i=0; i<lineArray.length; i++) {
        timestamp = lineArray[i]["time"];
        if ((timestamp >= startTS) && (timestamp < endTS)) {
          associativeArray[person].timestamps.push(timestamp);
        }
      }
    });
  });

  // Sort + compute per person
  people.forEach(function(person) {

    var myList = [];

    myList.sort(function(x, y){
      return x.timestamp - y.timestamp;
    })

    myList = associativeArray[person].timestamps;
    myList.sort();

    var current_day = "";
    var previous_day = "";
    var current_timestamp = 0;
    var previous_timestamp = 0;
    var timeTotalForThisPersonThisDay = 0;

    // Compute daily time for each person
    for (var i = 0; i < myList.length; i++) {

      current_timestamp = myList[i];
      current_day = convertTimestampToDateString(current_timestamp);

      if (previous_timestamp != 0) {
        if (current_day == previous_day) {
          timeDiff = current_timestamp - previous_timestamp;
          if (timeDiff < tenMinuteLogTimeout) {
            totalTimeForAll += timeDiff;
            timeTotalForThisPersonThisDay += timeDiff;
            var dayOfWeek = convertTimestampToDayOfWeek(current_timestamp);
            dayOfWeekTotal[dayOfWeek] += timeDiff;
          }
        }
        else {
          if ((person != "") && (timeTotalForThisPersonThisDay > 0)) {
            timeListMessage += printLineTime(person, current_day, Math.round(timeTotalForThisPersonThisDay/3600), maxItemLength);
            if (typeof(itemTotalPerDay[current_day]) == "undefined") { itemTotalPerDay[current_day] = timeTotalForThisPersonThisDay; }
            else {itemTotalPerDay[current_day] += timeTotalForThisPersonThisDay; }
          }
          timeTotalForThisPersonThisDay = 0;
        }
      }
      previous_day = current_day;
      previous_timestamp = current_timestamp;
    }
  });

  var timeInHours = Math.round(totalTimeForAll / 3600);

  var Message = "";
  Message += "Character:         " + character + "\r\n";
  Message += "Date range:        " + startDateString + " through " + endDateString + "\r\n\r\n";
  Message += "Total time:        " + timeInHours + " hours\r\n\r\n";
  Message += timeListMessage;
  document.getElementById('StatsDisplay').style.display="block";
  document.getElementById('TableDisplay').style.display="none";
  document.getElementById("StatsDisplay").innerHTML = Message;
  drawTimeChart(itemTotalPerDay);
  drawTimePieChart(dayOfWeekTotal);
}


  var featCollection = [];

  featCollection.push({name:"Explore Gotham",                    category:"Exploration",subcategory:"General",   stars:3,points:50,faction:"Both",description:"Explore all Gotham districts"});
  featCollection.push({name:"Explore Metropolis",                category:"Exploration",subcategory:"General",   stars:3,points:50,faction:"Both",description:"Explore all Metropolis districts"});
  featCollection.push({name:"Intrepid Explorer",                 category:"Exploration",subcategory:"General",   stars:3,points:50,faction:"Both",description:"Explore every Gotham/Metropolis district and all Alerts/Raids"});
  featCollection.push({name:"Explore the Alerts",                category:"Exploration",subcategory:"General",   stars:3,points:50,faction:"Both",description:"Explore all alerts in the classic game"});
  featCollection.push({name:"Donut Delivery",                    category:"Exploration",subcategory:"General",   stars:2,points:25,faction:"Hero",description:"Visit each of the classic police stations"});
  featCollection.push({name:"Club Kids",                         category:"Exploration",subcategory:"General",   stars:1,points:10,faction:"Villain",description:"Visit all the villain safehouses"});
  featCollection.push({name:"Explore the Hall of Doom",          category:"Exploration",subcategory:"General",   stars:1,points:10,faction:"Villain",description:"Explore the Hall of Doom"});
  featCollection.push({name:"Explore the Watchtower",            category:"Exploration",subcategory:"General",   stars:1,points:10,faction:"Hero",description:"Explore the JLA Watchtower"});
  featCollection.push({name:"Explore Kahndaq",                   category:"Exploration",subcategory:"Raids",     stars:1,points:10,faction:"Both",description:"Explore the area around Black Adam's palace in Kahndaq"});
  featCollection.push({name:"Explore the Batcave Outer Caverns", category:"Exploration",subcategory:"Raids",     stars:1,points:10,faction:"Both",description:"Explore the outermost reaches of the Batcave"});
  featCollection.push({name:"Explore the Inner Sanctum",         category:"Exploration",subcategory:"Raids",     stars:1,points:10,faction:"Both",description:"Explore the Inner Sanctum of the Batcave"});
  featCollection.push({name:"Explore Midtown Metropolis",        category:"Exploration",subcategory:"Metropolis",stars:1,points:10,faction:"Both",description:"Explore the Midtown district in Metropolis"});
  featCollection.push({name:"Man of Stone",                      category:"Exploration",subcategory:"Metropolis",stars:1,points:10,faction:"Both",description:"Visit the Superman Memorial Statue in Centennial Park"});
  featCollection.push({name:"Visit Stryker's Island",            category:"Exploration",subcategory:"Metropolis",stars:1,points:10,faction:"Both",description:"Visit Stryker's Island in Metropolis"});
  featCollection.push({name:"Explore Little Bohemia",            category:"Exploration",subcategory:"Metropolis",stars:1,points:10,faction:"Both",description:"Explore Little Bohemia in Metropolis"});
  featCollection.push({name:"Explore Suicide Slums",             category:"Exploration",subcategory:"Metropolis",stars:1,points:10,faction:"Both",description:"Explore the Suicide Slums district in Metropolis"});
  featCollection.push({name:"On Top of the World",               category:"Exploration",subcategory:"Metropolis",stars:1,points:10,faction:"Both",description:"Visit the highest point of the Daily Planet"});
  featCollection.push({name:"View from the Top",                 category:"Exploration",subcategory:"Metropolis",stars:1,points:10,faction:"Both",description:"Visit the highest point of LexCorp Tower"});
  featCollection.push({name:"Explore Metropolis Chinatown",      category:"Exploration",subcategory:"Metropolis",stars:1,points:10,faction:"Both",description:"Explore Chinatown Metropolis"});
  featCollection.push({name:"Explore Downtown Metropolis",       category:"Exploration",subcategory:"Metropolis",stars:1,points:10,faction:"Both",description:"Explore the Downtown district"});
  featCollection.push({name:"Explore the Historic District",     category:"Exploration",subcategory:"Metropolis",stars:1,points:10,faction:"Both",description:"Explore the Historic District in Metropolis"});
  featCollection.push({name:"Explore the Tomorrow District",     category:"Exploration",subcategory:"Metropolis",stars:1,points:10,faction:"Both",description:"Explore the Tomorrow District in Metropolis"});
  featCollection.push({name:"Find the Bat-Signal",               category:"Exploration",subcategory:"Gotham",    stars:1,points:10,faction:"Both",description:"Find the Bat-Signal in the East End Gotham"});
  featCollection.push({name:"Explore the East End",              category:"Exploration",subcategory:"Gotham",    stars:1,points:10,faction:"Both",description:"Explore Gotham's East End"});
  featCollection.push({name:"Visit the Wayne Memorial",          category:"Exploration",subcategory:"Gotham",    stars:1,points:10,faction:"Both",description:"Visit the Wayne Memorial in Crime Alley"});
  featCollection.push({name:"Explore the Otisburg District",     category:"Exploration",subcategory:"Gotham",    stars:1,points:10,faction:"Both",description:"Explore the Otisburg district in Gotham"});
  featCollection.push({name:"Explore the Burnley District",      category:"Exploration",subcategory:"Gotham",    stars:1,points:10,faction:"Both",description:"Explore the Burnley district in Gotham"});
  featCollection.push({name:"Explore Robinson Park",             category:"Exploration",subcategory:"Gotham",    stars:1,points:10,faction:"Both",description:"Explore Robinson Park in Gotham"});
  featCollection.push({name:"Explore Arkham Island",             category:"Exploration",subcategory:"Gotham",    stars:1,points:10,faction:"Both",description:"Explore Arkham Island in Gotham"});
  featCollection.push({name:"Explore Gotham Chinatown",          category:"Exploration",subcategory:"Gotham",    stars:1,points:10,faction:"Both",description:"Explore Gotham's Chinatown district"});
  featCollection.push({name:"Explore Old Gotham",                category:"Exploration",subcategory:"Gotham",    stars:1,points:10,faction:"Both",description:"Explore the Old Gotham district"});
  featCollection.push({name:"Explore the Diamond District",      category:"Exploration",subcategory:"Gotham",    stars:1,points:10,faction:"Both",description:"Explore the Diamond district in Gotham"});
  featCollection.push({name:"Explore Area 51",                   category:"Exploration",subcategory:"Alerts",    stars:1,points:10,faction:"Both",description:"Explore key areas of the Area 51 complex"});
  featCollection.push({name:"Explore Gorilla Island",            category:"Exploration",subcategory:"Alerts",    stars:1,points:10,faction:"Both",description:"Explore the shipwreck and environs on Gorilla Island"});
  featCollection.push({name:"Explore the HIVE Moon Site",        category:"Exploration",subcategory:"Alerts",    stars:1,points:10,faction:"Both",description:"Explore the HIVE dig site on the moon"});
  featCollection.push({name:"Explore Oolong Island",             category:"Exploration",subcategory:"Alerts",    stars:1,points:10,faction:"Both",description:"Explore the enclave of Oolong Island"});
  featCollection.push({name:"Explore Bludhaven",                 category:"Exploration",subcategory:"Alerts",    stars:1,points:10,faction:"Both",description:"Explore toxic-wrecked areas of downtown Bludhaven"});
  featCollection.push({name:"Explore Smallville",                category:"Exploration",subcategory:"Alerts",    stars:1,points:10,faction:"Both",description:"Explore key areas of Smallville, KS"});

  featCollection.push({name:"Prepared",                    category:"General",subcategory:"General",stars:1,points:10,faction:"Both",description:"Obtain 1 Mark of Conquest or Mark of Legend"});
  featCollection.push({name:"More than You Could Chew",    category:"General",subcategory:"General",stars:2,points:25,faction:"Both",description:"Encounter all 5 preoccupied iconic villains"});
  featCollection.push({name:"Fanboy",                      category:"General",subcategory:"General",stars:2,points:25,faction:"Both",description:"Encounter all 6 preoccupied iconic heroes"});
  featCollection.push({name:"Bounty Hunter",               category:"General",subcategory:"General",stars:3,points:50,faction:"Hero",description:"Complete all of the classic wanted poster missions as a Hero"});
  featCollection.push({name:"Hired Gun",                   category:"General",subcategory:"General",stars:3,points:50,faction:"Villain",description:"Complete all of the classic wanted poster missions as a Villain"});
  featCollection.push({name:"Gotham Boost-Tour",           category:"General",subcategory:"General",stars:1,points:10,faction:"Both",description:"Complete all of the classic Booster Gold city travel missions in Gotham"});
  featCollection.push({name:"Metropolis Boost-Tour",       category:"General",subcategory:"General",stars:1,points:10,faction:"Both",description:"Complete all of the classic Booster Gold city travel missions in Metropolis"});
  featCollection.push({name:"Everyday Hero",               category:"General",subcategory:"General",stars:1,points:10,faction:"Hero",description:"Accomplish 25 everyday heroic acts"});
  featCollection.push({name:"Everyday Villain",            category:"General",subcategory:"General",stars:2,points:25,faction:"Villain",description:"Perpetrate 25 everyday villainous acts"});
  featCollection.push({name:"Red Barrel Buster Rookie",    category:"General",subcategory:"General",stars:1,points:10,faction:"Both",description:"Break 5 red Explosion Barrels"});
  featCollection.push({name:"Red Barrel Buster Expert",    category:"General",subcategory:"General",stars:1,points:10,faction:"Both",description:"Break 25 red Explosion Barrels"});
  featCollection.push({name:"Red Barrel Buster Master",    category:"General",subcategory:"General",stars:2,points:25,faction:"Both",description:"Break 100 red Explosion barrels"});
  featCollection.push({name:"BOOM!",                       category:"General",subcategory:"General",stars:3,points:50,faction:"Both",description:"Break 250 red Explosion barrels"});
  featCollection.push({name:"Orange Barrel Buster Rookie", category:"General",subcategory:"General",stars:1,points:10,faction:"Both",description:"Break 5 orange Restoration barrels"});
  featCollection.push({name:"Orange Barrel Buster Expert", category:"General",subcategory:"General",stars:1,points:10,faction:"Both",description:"Break 25 orange Restoration barrels"});
  featCollection.push({name:"Orange Barrel Buster Master", category:"General",subcategory:"General",stars:2,points:25,faction:"Both",description:"Break 100 orange Restoration barrels"});
  featCollection.push({name:"Heals Yeeeah!",               category:"General",subcategory:"General",stars:3,points:50,faction:"Both",description:"Break 250 orange Restoration barrels"});
  featCollection.push({name:"Barrel of Monkeys",           category:"General",subcategory:"General",stars:3,points:50,faction:"Both",description:"Break 500 orange Restoration barrels"});
  featCollection.push({name:"Get Your Kong On",            category:"General",subcategory:"General",stars:3,points:50,faction:"Both",description:"Break 1000 orange Restoration barrels"});
  featCollection.push({name:"Loot!",                       category:"General",subcategory:"General",stars:1,points:10,faction:"Both",description:"Open 5 treasure chests"});
  featCollection.push({name:"Jackpot!",                    category:"General",subcategory:"General",stars:1,points:10,faction:"Both",description:"Open 10 treasure chests"});
  featCollection.push({name:"Lunch Money",                 category:"General",subcategory:"General",stars:1,points:10,faction:"Both",description:"Open 50 treasure chests"});
  featCollection.push({name:"Money in Your Pocket",        category:"General",subcategory:"General",stars:1,points:10,faction:"Both",description:"Open 100 treasure chests"});
  featCollection.push({name:"Cashing Checks",              category:"General",subcategory:"General",stars:1,points:10,faction:"Both",description:"Open 250 treasure chests"});
  featCollection.push({name:"Upcoming Mogul",              category:"General",subcategory:"General",stars:2,points:25,faction:"Both",description:"Open 500 treasure chests"});
  featCollection.push({name:"Young Billionaire",           category:"General",subcategory:"General",stars:3,points:50,faction:"Both",description:"Open 1000 treasure chests"});
  featCollection.push({name:"25X Hit!",                    category:"General",subcategory:"General",stars:1,points:10,faction:"Both",description:"Reach 25 hits on the hit counter"});
  featCollection.push({name:"50X Hit!",                    category:"General",subcategory:"General",stars:1,points:10,faction:"Both",description:"Reach 50 hits on the hit counter"});
  featCollection.push({name:"100X Hit!",                   category:"General",subcategory:"General",stars:2,points:25,faction:"Both",description:"Reach 100 hits on the hit counter"});
  featCollection.push({name:"Jailbird",                    category:"General",subcategory:"General",stars:1,points:10,faction:"Both",description:"Use the Breakout ability 1 times"});
  featCollection.push({name:"Escape Artist",               category:"General",subcategory:"General",stars:1,points:10,faction:"Both",description:"Use the Breakout ability 5 times"});
  featCollection.push({name:"Escape Artist Pro",           category:"General",subcategory:"General",stars:1,points:10,faction:"Both",description:"Use the Breakout ability 25 times"});
  featCollection.push({name:"Master Escape Artist",        category:"General",subcategory:"General",stars:1,points:10,faction:"Both",description:"Use the Breakout ability 100 times"});
  featCollection.push({name:"Control Issues",              category:"General",subcategory:"General",stars:2,points:25,faction:"Both",description:"Use the Breakout ability 500 times"});
  featCollection.push({name:"Under Control",               category:"General",subcategory:"General",stars:2,points:25,faction:"Both",description:"Use the Breakout ability 1000 times"});
  featCollection.push({name:"Back From the Hack",          category:"General",subcategory:"General",stars:3,points:50,faction:"Both",description:"Survived the 2011 network hack!"});
  featCollection.push({name:"Domination Unleashed",        category:"General",subcategory:"General",stars:1,points:10,faction:"Villain",description:"Become a member of the Society with Circe as your mentor"});
  featCollection.push({name:"Masterminds Unleashed",       category:"General",subcategory:"General",stars:1,points:10,faction:"Villain",description:"Become a member of the Society with Lex Luthor as your mentor"});
  featCollection.push({name:"Insanity Unleashed",          category:"General",subcategory:"General",stars:1,points:10,faction:"Villain",description:"Become a member of the Society with the Joker as your mentor"});
  featCollection.push({name:"Amazons United",              category:"General",subcategory:"General",stars:1,points:10,faction:"Hero",description:"Become a member of the Justice League with Wonder Woman as your mentor"});
  featCollection.push({name:"Superman United",             category:"General",subcategory:"General",stars:1,points:10,faction:"Hero",description:"Become a member of the Justice League with Superman as your mentor"});
  featCollection.push({name:"Dark Knights United",         category:"General",subcategory:"General",stars:1,points:10,faction:"Hero",description:"Become a member of the Justice League with Batman as your mentor"});
  featCollection.push({name:"Criminal Mastermind",         category:"General",subcategory:"General",stars:2,points:25,faction:"Villain",description:"Achieve level 30 as a villain mentored by Lex Luthor"});
  featCollection.push({name:"The Queen's Favorite",        category:"General",subcategory:"General",stars:2,points:25,faction:"Villain",description:"Achieve level 30 as a villain mentored by Circe"});
  featCollection.push({name:"The Joker in the Deck",       category:"General",subcategory:"General",stars:2,points:25,faction:"Villain",description:"Achieve level 30 as a villain mentored by the Joker"});
  featCollection.push({name:"Champion of Earth",           category:"General",subcategory:"General",stars:2,points:25,faction:"Hero",description:"Achieve level 30 as a hero mentored by Superman"});
  featCollection.push({name:"Warrior of Truth",            category:"General",subcategory:"General",stars:2,points:25,faction:"Hero",description:"Achieve level 30 as a hero mentored by Wonder Woman"});
  featCollection.push({name:"Knight for Justice",          category:"General",subcategory:"General",stars:2,points:25,faction:"Hero",description:"Achieve level 30 as a hero mentored by Batman"});
  featCollection.push({name:"Speedster Supreme",           category:"General",subcategory:"General",stars:2,points:25,faction:"Both",description:"Achieve level 30 as a speedster"});
  featCollection.push({name:"Fearless Flier",              category:"General",subcategory:"General",stars:2,points:25,faction:"Both",description:"Achieve level 30 as a flyer"});
  featCollection.push({name:"Acrobatic Ace",               category:"General",subcategory:"General",stars:2,points:25,faction:"Both",description:"Achieve level 30 as an acrobat"});
  featCollection.push({name:"Tanks Very Much",             category:"General",subcategory:"General",stars:1,points:10,faction:"Both",description:"Achieve level 10 and gain the Tank Role"});
  featCollection.push({name:"Mission Control",             category:"General",subcategory:"General",stars:1,points:10,faction:"Both",description:"Achieve level 10 and gain the Controller Role"});
  featCollection.push({name:"The Healing Touch",           category:"General",subcategory:"General",stars:1,points:10,faction:"Both",description:"Achieve level 10 and gain the Healer Role"});
  featCollection.push({name:"Villainous Scion",            category:"General",subcategory:"General",stars:2,points:25,faction:"Villain",description:"Achieve level 20 as a villain"});
  featCollection.push({name:"Heroic Legionnaire",          category:"General",subcategory:"General",stars:1,points:10,faction:"Hero",description:"Achieve level 20 as a hero"});

  featCollection.push({name:"Insert Token",                       category:"General",subcategory:"Tokens of Merit",stars:1,points:10,faction:"Both",description:"Add 1 Token of Merit"});
  featCollection.push({name:"Tokens of Appreciation",             category:"General",subcategory:"Tokens of Merit",stars:1,points:10,faction:"Both",description:"Add 10 Tokens of Merit"});
  featCollection.push({name:"A Mark Saved is a Token Earned",     category:"General",subcategory:"Tokens of Merit",stars:1,points:10,faction:"Both",description:"Add 25 Tokens of Merit"});
  featCollection.push({name:"Emeritus",                           category:"General",subcategory:"Tokens of Merit",stars:1,points:10,faction:"Both",description:"Add 50 Tokens of Merit"});
  featCollection.push({name:"Merit Badge",                        category:"General",subcategory:"Tokens of Merit",stars:1,points:10,faction:"Both",description:"Add 100 Tokens of Merit"});
  featCollection.push({name:"Merit Scholar",                      category:"General",subcategory:"Tokens of Merit",stars:2,points:25,faction:"Both",description:"Add 250 Tokens of Merit"});
  featCollection.push({name:"Mark the Occasion",                  category:"General",subcategory:"Tokens of Merit",stars:2,points:25,faction:"Both",description:"Add 500 Tokens of Merit"});
  featCollection.push({name:"Meritocracy",                        category:"General",subcategory:"Tokens of Merit",stars:2,points:25,faction:"Both",description:"Add 750 Tokens of Merit"});
  featCollection.push({name:"Buy the Same Token",                 category:"General",subcategory:"Tokens of Merit",stars:2,points:25,faction:"Both",description:"Add 1000 Tokens of Merit"});
  featCollection.push({name:"Are You Token to Me?",               category:"General",subcategory:"Tokens of Merit",stars:3,points:50,faction:"Both",description:"Add 2500 Tokens of Merit"});
  featCollection.push({name:"If I Had a Token for Every Time...", category:"General",subcategory:"Tokens of Merit",stars:3,points:50,faction:"Both",description:"Add 5000 Tokens of Merit"});

  featCollection.push({name:"Natural Talent",                                    category:"Races",subcategory:"General",stars:3,points:50,faction:"Both",description:"Win a platinum medal on any expert level race without purchasing movement mode traits"});
  featCollection.push({name:"Pro Athlete",                                       category:"Races",subcategory:"General",stars:3,points:50,faction:"Both",description:"Win a platinum medal on any adept level race without purchasing movement mode traits"});
  featCollection.push({name:"Platinum Pace",                                     category:"Races",subcategory:"General",stars:1,points:10,faction:"Both",description:"Earn a platinum medal in any race"});

  featCollection.push({name:"You Can Be My Wingman Anytime",                     category:"Races",subcategory:"Flight",stars:2,points:25,faction:"Both",description:"Complete all Flight master-level races in the classic game"});
  featCollection.push({name:"Time to Buzz a Tower",                              category:"Races",subcategory:"Flight",stars:2,points:25,faction:"Both",description:"Complete all Flight expert races in the classic game"});
  featCollection.push({name:"Do You Think Your Name Will Be on That Plaque?",    category:"Races",subcategory:"Flight",stars:2,points:25,faction:"Both",description:"Complete all Flight adept races in the classic game"});
  featCollection.push({name:"More Than Just Fancy Flying",                       category:"Races",subcategory:"Flight",stars:2,points:25,faction:"Both",description:"Complete all Flight skilled races in the classic game"});
  featCollection.push({name:"Gutsiest Move I Ever Saw",                          category:"Races",subcategory:"Flight",stars:1,points:10,faction:"Hero",description:"Complete all Flight Hero rookie races in the classic game"});
  featCollection.push({name:"Pilot's License",                                   category:"Races",subcategory:"Flight",stars:1,points:10,faction:"Hero",description:"Complete all Flight Hero introductory races in the classic game"});
  featCollection.push({name:"It's Looking Good So Far",                          category:"Races",subcategory:"Flight",stars:1,points:10,faction:"Villain",description:"Complete all Flight Villain skilled races in the classic game"});
  featCollection.push({name:"I Am Dangerous",                                    category:"Races",subcategory:"Flight",stars:1,points:10,faction:"Villain",description:"Complete all Flight Villain introductory races in the classic game"});
  featCollection.push({name:"Gotham Master Flier",                               category:"Races",subcategory:"Flight",stars:2,points:25,faction:"Both",description:"Complete all Flight Gotham races"});
  featCollection.push({name:"Metropolis Master Flier",                           category:"Races",subcategory:"Flight",stars:2,points:25,faction:"Both",description:"Complete all Flight Metropolis races"});

  featCollection.push({name:"Prodigious Performer",                              category:"Races",subcategory:"Acrobat",stars:2,points:25,faction:"Both",description:"Complete all Acrobatics master-level races in the classic game"});
  featCollection.push({name:"Terrific Trapezist",                                category:"Races",subcategory:"Acrobat",stars:2,points:25,faction:"Both",description:"Complete all Acrobatics expert races in the classic game"});
  featCollection.push({name:"Amazing Aerialist",                                 category:"Races",subcategory:"Acrobat",stars:2,points:25,faction:"Both",description:"Complete all Acrobatics adept races in the classic game"});
  featCollection.push({name:"Terrific Tumbler",                                  category:"Races",subcategory:"Acrobat",stars:2,points:25,faction:"Both",description:"Complete all Acrobatics skilled races in the classic game"});
  featCollection.push({name:"Acrobatic Amateur",                                 category:"Races",subcategory:"Acrobat",stars:1,points:10,faction:"Hero",description:"Complete all Acrobatics Hero rookie races in the classic game"});
  featCollection.push({name:"Circus Act",                                        category:"Races",subcategory:"Acrobat",stars:1,points:10,faction:"Hero",description:"Complete all Acrobatics Hero introductory races in the classic game"});
  featCollection.push({name:"Fantastic Funambulist",                             category:"Races",subcategory:"Acrobat",stars:1,points:10,faction:"Villain",description:"Complete all Acrobatics Villain rookie races in the classic game"});
  featCollection.push({name:"Acrobat Athlete",                                   category:"Races",subcategory:"Acrobat",stars:1,points:10,faction:"Villain",description:"Complete all Acrobatics Villain introductory races in the classic game"});
  featCollection.push({name:"Gotham Master Acrobat: Hero",                       category:"Races",subcategory:"Acrobat",stars:2,points:25,faction:"Both",description:"Complete all Acrobatics Gotham races"});
  featCollection.push({name:"Metropolis Master Acrobat: Hero",                   category:"Races",subcategory:"Acrobat",stars:2,points:25,faction:"Both",description:"Complete all Acrobatics Metropolis races"});

  featCollection.push({name:"If You Ain't First, You're Last",                   category:"Races",subcategory:"Speedster",stars:2,points:25,faction:"Both",description:"Complete all Speedster master-level races in the classic game"});
  featCollection.push({name:"Shake and Bake",                                    category:"Races",subcategory:"Speedster",stars:2,points:25,faction:"Both",description:"Complete all Speedster expert races in the classic game"});
  featCollection.push({name:"It Doesn't Matter If You Win By An Inch or a Mile", category:"Races",subcategory:"Speedster",stars:2,points:25,faction:"Both",description:"Complete all Speedster adept races in the classic game"});
  featCollection.push({name:"You Almost Had Me? You Never Had a Chance",         category:"Races",subcategory:"Speedster",stars:2,points:25,faction:"Both",description:"Complete all Speedster skilled races in the classic game"});
  featCollection.push({name:"What Are You, a Wheelman",                          category:"Races",subcategory:"Speedster",stars:1,points:10,faction:"Hero",description:"Complete all Speedster Hero rookie races in the classic game"});
  featCollection.push({name:"Need For Speed",                                    category:"Races",subcategory:"Speedster",stars:1,points:10,faction:"Hero",description:"Complete all Speedster Hero introductory races in the classic game"});
  featCollection.push({name:"Watcha Runnin' Under There, Man?",                  category:"Races",subcategory:"Speedster",stars:1,points:10,faction:"Villain",description:"Complete all Speedster Villain rookie races in the classic game"});
  featCollection.push({name:"Nice Wheels",                                       category:"Races",subcategory:"Speedster",stars:1,points:10,faction:"Villain",description:"Complete all Speedster Villain introductory races in the classic game"});
  featCollection.push({name:"Gotham Master Speedster",                           category:"Races",subcategory:"Speedster",stars:2,points:25,faction:"Both",description:"Complete all Speedster Gotham speedster races"});
  featCollection.push({name:"Metropolos Master Speedster",                       category:"Races",subcategory:"Speedster",stars:2,points:25,faction:"Both",description:"Complete all Speedster Metropolis races"});

  featCollection.push({name:"Practiced Eye",               category:"General",subcategory:"Collectibles",stars:1,points:10,faction:"Both",description:"Complete a collection, briefing, or investigation"});
  featCollection.push({name:"Master Detective",            category:"General",subcategory:"Collectibles",stars:3,points:50,faction:"Both",description:"Complete all Investigations in the classic game"});
  featCollection.push({name:"Fully Briefed",               category:"General",subcategory:"Collectibles",stars:3,points:50,faction:"Both",description:"Complete all briefings in the classic game"});
  featCollection.push({name:"Collections Agent",           category:"General",subcategory:"Collectibles",stars:3,points:50,faction:"Both",description:"Complete all collections and master collections in the classic game"});
  featCollection.push({name:"Hotel Detective",             category:"General",subcategory:"Collectibles",stars:1,points:10,faction:"Both",description:"Complete 10 collections, briefings, or investigations"});
  featCollection.push({name:"Who Questions the Question?", category:"General",subcategory:"Collectibles",stars:2,points:25,faction:"Both",description:"Complete 25 collections, briefings, or investigations"});
  featCollection.push({name:"Riddle Me This",              category:"General",subcategory:"Collectibles",stars:2,points:25,faction:"Both",description:"Complete 50 collections, briefings, or investigations"});

  featCollection.push({name:"Well-Equipped",                  category:"Styles",subcategory:"General",stars:1,points:10,faction:"Both",description:"Collect 10 Styles"});
  featCollection.push({name:"Sharply Dressed",                category:"Styles",subcategory:"General",stars:1,points:10,faction:"Both",description:"Collect 25 Styles"});
  featCollection.push({name:"Costumed Crusader",              category:"Styles",subcategory:"General",stars:1,points:10,faction:"Both",description:"Collect 50 Styles"});
  featCollection.push({name:"Enormous Ensemble",              category:"Styles",subcategory:"General",stars:1,points:10,faction:"Both",description:"Collect 100 Styles"});
  featCollection.push({name:"Mode Model",                     category:"Styles",subcategory:"General",stars:2,points:25,faction:"Both",description:"Collect 250 Styles"});
  featCollection.push({name:"Fight Fire with Fashion",        category:"Styles",subcategory:"General",stars:2,points:25,faction:"Both",description:"Collect 500 Styles"});
  featCollection.push({name:"Emblematic of Heroism",          category:"Styles",subcategory:"General",stars:1,points:10,faction:"Hero",description:"Collect all classic Hero faction emblems"});
  featCollection.push({name:"The Signs of Villainy",          category:"Styles",subcategory:"General",stars:1,points:10,faction:"Villain",description:"Collect all classic Villain faction emblems"});

  featCollection.push({name:"Dressed to Kill",             category:"Styles",subcategory:"Iconic", stars:3,points:50,faction:"Both",description:"Collect a complete Iconic PvP battle suit"});
  featCollection.push({name:"True Colors",                 category:"Styles",subcategory:"Iconic", stars:3,points:50,faction:"Both",description:"Collect a complete iconic PvE battle suit"});
  featCollection.push({name:"Kryptonian Defender",         category:"Styles",subcategory:"Iconic", stars:3,points:50,faction:"Hero",description:"Collect all styles in the House of El Warsuit set"});
  featCollection.push({name:"LexCorp Warbringer",          category:"Styles",subcategory:"Iconic", stars:3,points:50,faction:"Villain",description:"Collect all styles of the LexCorp Salvation set"});
  featCollection.push({name:"Thanagarian Vindicator",      category:"Styles",subcategory:"Iconic", stars:3,points:50,faction:"Both",description:"Collect all styles in the Nth - Metal Battlesuit Set"});
  featCollection.push({name:"Heart of Kryptonite",         category:"Styles",subcategory:"Iconic", stars:3,points:50,faction:"Villain",description:"Collect all styles in the Metallo's Maw set"});
  featCollection.push({name:"One with the Speed Force",    category:"Styles",subcategory:"Iconic", stars:3,points:50,faction:"Both",description:"Collect all styles of the Speed - Force Spectrum set"});
  featCollection.push({name:"Kneel Before Zod!",           category:"Styles",subcategory:"Iconic", stars:3,points:50,faction:"Villain",description:"Collect all styles of the Phantom Zone Reaver set"});
  featCollection.push({name:"Steel Soldier",               category:"Styles",subcategory:"Iconic", stars:3,points:50,faction:"Hero",description:"Collect all styles in the STEELsuit MK-1 set"});
  featCollection.push({name:"Rockin' Robin",               category:"Styles",subcategory:"Iconic", stars:3,points:50,faction:"Both",description:"Collect all styles of the Raptor Infiltrator set"});
  featCollection.push({name:"Spear of Themyscira",         category:"Styles",subcategory:"Iconic", stars:3,points:50,faction:"Hero",description:"Collect all styles of the Hera's Strength set"});
  featCollection.push({name:"Spearbearer of Nabu",         category:"Styles",subcategory:"Iconic", stars:3,points:50,faction:"Hero",description:"Collect all styles of the Fate's Faith set"});
  featCollection.push({name:"Defender of Gotham",          category:"Styles",subcategory:"Iconic", stars:3,points:50,faction:"Hero",description:"Collect all styles in the Dark Specter Batsuit set"});
  featCollection.push({name:"Rock of Eternity's Guardian", category:"Styles",subcategory:"Iconic", stars:3,points:50,faction:"Both",description:"Collect all styles of the Aegis of Eternity set"});
  featCollection.push({name:"Walking Rampart",             category:"Styles",subcategory:"Iconic", stars:3,points:50,faction:"Villain",description:"Collect all styles of the Sunstone Bulwark set"});
  featCollection.push({name:"Cutting Edge of Krypton",     category:"Styles",subcategory:"Iconic", stars:3,points:50,faction:"Both",description:"Collect all styles of the Sunstone's Edge set"});
  featCollection.push({name:"Bomber Man",                  category:"Styles",subcategory:"Iconic", stars:3,points:50,faction:"Both",description:"Collect all styles of the Avatar Bombardier set"});
  featCollection.push({name:"How Many Points Is That?",    category:"Styles",subcategory:"Iconic", stars:3,points:50,faction:"Both",description:"Collect all styles of the Spirit of the Stag set"});
  featCollection.push({name:"By the Horns",                category:"Styles",subcategory:"Iconic", stars:3,points:50,faction:"Both",description:"Collect all styles of the Last Aurochs set"});
  featCollection.push({name:"That's Using Your Head",      category:"Styles",subcategory:"Iconic", stars:3,points:50,faction:"Both",description:"Collect all styles of the Strength of the Ram set"});
  featCollection.push({name:"Lion's Share",                category:"Styles",subcategory:"Iconic", stars:3,points:50,faction:"Both",description:"Collect all styles of the Heart of the Lion set"});
  featCollection.push({name:"Make Sparks Fly",             category:"Styles",subcategory:"Iconic", stars:2,points:25,faction:"Both",description:"Collect all styles of the High Voltage set"});
  featCollection.push({name:"Avatar of Trigon",            category:"Styles",subcategory:"Iconic", stars:3,points:50,faction:"Villain",description:"Collect all styles of the Aegis of Azerath set"});
  featCollection.push({name:"Gauntlet of the Goddess",     category:"Styles",subcategory:"Iconic", stars:3,points:50,faction:"Villain",description:"Collect all styles of the Vengeance of Hecate set"});
  featCollection.push({name:"The Fury of Teth-Adam",       category:"Styles",subcategory:"Iconic", stars:3,points:50,faction:"Villain",description:"Collect all styles of the Shroud of Anubis set"});
  featCollection.push({name:"Heart of Ice",                category:"Styles",subcategory:"Iconic", stars:3,points:50,faction:"Villain",description:"Collect all styles of the Frozen Fury set"});
  featCollection.push({name:"Mercenary for Hire",          category:"Styles",subcategory:"Iconic", stars:3,points:50,faction:"Villain",description:"Collect all styles of the Mercenary's Malice set"});
  featCollection.push({name:"Commanding Presence",         category:"Styles",subcategory:"Iconic", stars:3,points:50,faction:"Both",description:"Collect all styles of the Kryptonian Commander set"});
  featCollection.push({name:"The Look Of Tomorrow, Today", category:"Styles",subcategory:"Iconic", stars:2,points:25,faction:"Both",description:"Collect all styles of the Reverse set"});
  featCollection.push({name:"The Tactleneck",              category:"Styles",subcategory:"Iconic", stars:3,points:50,faction:"Both",description:"Collect all styles of the Checkmate Operative set"});
  featCollection.push({name:"Sneaky Service",              category:"Styles",subcategory:"Iconic", stars:3,points:50,faction:"Both",description:"Collect all styles of the Checkmate Informant set"});
  featCollection.push({name:"Knight Moves",                category:"Styles",subcategory:"Iconic", stars:3,points:50,faction:"Both",description:"Collect all styles of the Checkmate PvP Battlesuit"});
  featCollection.push({name:"The Armor Makes the Man",     category:"Styles",subcategory:"Iconic", stars:3,points:50,faction:"Both",description:"Collect all styles of the Knight PvP Battlesuit"});

  featCollection.push({name:"Otherworldly",               category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all Styles in the Fourth World set"});
  featCollection.push({name:"Two Sides Of The Same Coin", category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Split Personality set"});
  featCollection.push({name:"Strength of Voltan",         category:"Styles",subcategory:"Theme", stars:1,points:10,faction:"Both",description:"Collect all styles in the Mayan set"});
  featCollection.push({name:"Dimensional Traveler",       category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Zonewalker set"});
  featCollection.push({name:"On Metal Wings",             category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Winged Fury set"});
  featCollection.push({name:"Pulsar STAR",                category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the STAR Ex set"});
  featCollection.push({name:"The Immutable",              category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Villain",description:"Collect all styles in the Eternal set"});
  featCollection.push({name:"Anubis Ascendant",           category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Egyptian Sorcerer set"});
  featCollection.push({name:"Incurably Insane",           category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Villain",description:"Collect all styles in the Bulwark of Madness set"});
  featCollection.push({name:"Avian Assassin",             category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Raptor Tech set"});
  featCollection.push({name:"Shards of the Heart",        category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Heartshard set"});
  featCollection.push({name:"Guise of the Enemy",         category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Hijacked Servitor set"});
  featCollection.push({name:"Under the Sea",              category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Remora set"});
  featCollection.push({name:"Shaken, Not Stirred",        category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Formal set"});
  featCollection.push({name:"Go Go Gadgeteer",            category:"Styles",subcategory:"Theme", stars:1,points:10,faction:"Both",description:"Collect all styles in the Gadgeteer set"});
  featCollection.push({name:"Nobody's Fool",              category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Jester set"});
  featCollection.push({name:"Utterly Divine",             category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Divine set"});
  featCollection.push({name:"Knight of the Round",        category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Medieval set"});
  featCollection.push({name:"Shadows in the Night",       category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Villain",description:"Collect all styles in the Blood Bat set"});
  featCollection.push({name:"Bone Daddy",                 category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Necromancer set"});
  featCollection.push({name:"A New Classic",              category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the New Genesis set"});
  featCollection.push({name:"Expeditionary Force Leader", category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Paramilitary set"});
  featCollection.push({name:"Green Thumb",                category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Plant set"});
  featCollection.push({name:"Difference Engine Designed", category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Steam Punk set"});
  featCollection.push({name:"Dressed for the Streets",    category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Streets set"});
  featCollection.push({name:"Good Mojo",                  category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Voodoo set"});
  featCollection.push({name:"Bug Off",                    category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Insectoid set"});
  featCollection.push({name:"God of the North",           category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Viking set"});
  featCollection.push({name:"Boot to the Head",           category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Tech Ninja set"});
  featCollection.push({name:"Merlin's Tailor",            category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Wizardly set"});
  featCollection.push({name:"Mystically Masked",          category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Kabuki set"});
  featCollection.push({name:"Praetorian Elite",           category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Greco-Roman set"});
  featCollection.push({name:"Cyber-Reinforced",           category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Jah Kir set"});
  featCollection.push({name:"Life Is a Big, Dark Room",   category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Metalhead set"});
  featCollection.push({name:"Under the Spotlight",        category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Dresden 7 set"});
  featCollection.push({name:"Bio Booster",                category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Biomech set"});
  featCollection.push({name:"Like an Eagle",              category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Talon Lord set"});
  featCollection.push({name:"Scion of Skartaris",         category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Barbarian set"});
  featCollection.push({name:"Get Out On the Highway",     category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Biker set"});
  featCollection.push({name:"Hellstalker of Dis",         category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Demonic set"});
  featCollection.push({name:"Master of the Henge",        category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Druid set"});
  featCollection.push({name:"Dress Like an Egyptian",     category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Egyptian set"});
  featCollection.push({name:"Man in Tights",              category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Archer set"});
  featCollection.push({name:"Staying Frosty",             category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Antifreeze set"});
  featCollection.push({name:"Galactic Sentinel",          category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Alien Tech set"});
  featCollection.push({name:"Looking like Six Million Bucks",   category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Contemporary Tech set"});
  featCollection.push({name:"Military Grade",                   category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Military Tech set"});
  featCollection.push({name:"Am I Here to Amuse You?",          category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Psycho set"});
  featCollection.push({name:"Antique Aviator",                  category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Retro Tech set"});
  featCollection.push({name:"Secret Secret, I've Got a Secret", category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Robotic set"});
  featCollection.push({name:"Ready for Class",                  category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Schoolyard set"});
  featCollection.push({name:"Man or Machine?",                  category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Shielded Robot set"});
  featCollection.push({name:"Scaled Armor",                     category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Snake set"});
  featCollection.push({name:"Send Me An Angel",                 category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Archangel set"});
  featCollection.push({name:"Intergalactic Planetary",          category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Sector Agent set"});
  featCollection.push({name:"Planetary Intergalactic",          category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Sector Incendiary set"});
  featCollection.push({name:"Medicine Man",                     category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Shaman set"});
  featCollection.push({name:"Astral Projector",                 category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Astral Alloy set"});
  featCollection.push({name:"Defender of the Earth",            category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Brainiac Invader set"});
  featCollection.push({name:"Intruder Alert",                   category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Avatar Infiltrator set"});
  featCollection.push({name:"Warrior's Way",                    category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Noble Warrior set"});
  featCollection.push({name:"Cybernetic Upgrades",              category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Cybernetic set"});
  featCollection.push({name:"Early Adopter",                    category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Oolong set"});
  featCollection.push({name:"In Excelsis Deo",                  category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Rapture set"});
  featCollection.push({name:"Seraph of Dominance",              category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Seraph set"});
  featCollection.push({name:"Defender of the Universe",          category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Aerial Defender set"});
  featCollection.push({name:"No Mission Is Impossible",          category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Spec Ops set"});
  featCollection.push({name:"Building A Better Tomorrow",          category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Engineer set"});
  featCollection.push({name:"That's Logistics",          category:"Styles",subcategory:"Theme", stars:2,points:25,faction:"Both",description:"Collect all styles in the Logistics Officer set"});

  featCollection.push({name:"Fight for Right",                            category:"Raids",subcategory:"General",stars:2,points:25,faction:"Hero",description:"Complete all of the Raids as a hero in the classic game"});
  featCollection.push({name:"Raid and Rule",                              category:"Raids",subcategory:"General",stars:2,points:25,faction:"Villain",description:"Complete all of the Raids as a villain in the classic game"});
  featCollection.push({name:"A Speedy Resurrection",                      category:"Raids",subcategory:"General",stars:2,points:25,faction:"Both",description:"Complete the Kahndaq Raid in an hour or less"});
  featCollection.push({name:"EMP PDQ",                                    category:"Raids",subcategory:"General",stars:2,points:25,faction:"Both",description:"Complete the Outer Caverns Raid in an hour or less"});
  featCollection.push({name:"Eye Don't Have Much Time Left",              category:"Raids",subcategory:"General",stars:2,points:25,faction:"Both",description:"Complete the Inner Sanctum Raid in an hour or less"});
  featCollection.push({name:"The Final Countdown",                        category:"Raids",subcategory:"General",stars:2,points:25,faction:"Both",description:"Complete the Brainiac Sub-Construct Raid in an hour or less"});
  featCollection.push({name:"Total Annihilation",                         category:"Raids",subcategory:"General",stars:2,points:25,faction:"Both",description:"Defeat Brainiac after all three eradiactors are fully formed at the same time"});
  featCollection.push({name:"Eradication Denied",                         category:"Raids",subcategory:"General",stars:2,points:25,faction:"Both",description:"Defeat Brainiac without allowing an eradicator to fully form"});
  featCollection.push({name:"Some Days You Just Can't Get Rid of a Bomb", category:"Raids",subcategory:"General",stars:2,points:25,faction:"Both",description:"Bring Down the RCP's shield before a Flashbang Drone can Self-destruct"});
  featCollection.push({name:"The Family That Shields Together",           category:"Raids",subcategory:"General",stars:2,points:25,faction:"Both",description:"Trigger the EMP device within 15 seconds of the first OMAC Bat Family member activating their shield"});
  featCollection.push({name:"Zetta Testers Wanted",                       category:"Raids",subcategory:"General",stars:2,points:25,faction:"Both",description:"Defeat the Zetta Drone Before 5 waves of enemies attack"});
  featCollection.push({name:"A Feast for the Eye",                        category:"Raids",subcategory:"General",stars:2,points:25,faction:"Both",description:"Defeat Brother Eye before he consumes 10 minions"});
  featCollection.push({name:"Integration Complete",                       category:"Raids",subcategory:"General",stars:2,points:25,faction:"Both",description:"Defeat the ARC after the arc consumes each type of spawn"});
  featCollection.push({name:"Getting Your Foot in the Door",              category:"Raids",subcategory:"General",stars:2,points:25,faction:"Both",description:"Defeat Fortress of Solitude: The Chasm in under one hour"});
  featCollection.push({name:"But Scorpions Don't Lay Eggs",               category:"Raids",subcategory:"General",stars:2,points:25,faction:"Both",description:"Defeat the Scorpionod MK-1 without allowing any crystals to produce a burrower"});
  featCollection.push({name:"Deprogrammed",                               category:"Raids",subcategory:"General",stars:2,points:25,faction:"Both",description:"Defeat all combinations of Brainiac-Controlled Metas inside the Fortress of Solitude, finishing the Raid each time"});
  featCollection.push({name:"Not a Dog Person",                           category:"Raids",subcategory:"General",stars:2,points:25,faction:"Both",description:"Defeat the Sunstone Domineer without breaking Krypto's mind control"});
  featCollection.push({name:"Size Matters",                               category:"Raids",subcategory:"General",stars:2,points:25,faction:"Both",description:"Defeat the Jor-El Mech without shrinking him to the smallest size"});
  featCollection.push({name:"Cleansing the Fortress",                     category:"Raids",subcategory:"General",stars:2,points:25,faction:"Both",description:"Complete the Power Core raid in under 45 minutes"});
  featCollection.push({name:"MEDIC!",                                     category:"Raids",subcategory:"General",stars:3,points:50,faction:"Both",description:"Complete the Sunstone Matrix raid without attacking the Kryptonian Medic while he is shielded"});
  featCollection.push({name:"Arm's Reach",                                category:"Raids",subcategory:"General",stars:3,points:50,faction:"Both",description:"Complete the Sunstone Matrix raid without provoking the Kryptonian Sniper to use his devastating attack"});
  featCollection.push({name:"Highway to the Phantom Zone",                category:"Raids",subcategory:"General",stars:3,points:50,faction:"Both",description:"Complete the Sunstone Matrix raid in under 30 minutes"});
  featCollection.push({name:"Raid Expert: Kahndaq",                       category:"Raids",subcategory:"General",stars:1,points:10,faction:"Both",description:"Complete the Kahndaq raid on Normal difficulty"});
  featCollection.push({name:"Raid Expert: Inner Sanctum",                 category:"Raids",subcategory:"General",stars:1,points:10,faction:"Both",description:"Complete the Batcave: Inner Sanctum raid on Normal difficulty"});
  featCollection.push({name:"Raid Expert: Brainiac Sub-Construct",        category:"Raids",subcategory:"General",stars:1,points:10,faction:"Both",description:"Complete the Batcave: Brainiac Sub-Construct raid on Normal difficulty"});
  featCollection.push({name:"Raid Expert: The Chasm",                     category:"Raids",subcategory:"General",stars:1,points:10,faction:"Both",description:"Complete the Fortress of Solitude: The Chasm raid on Normal difficulty"});
  featCollection.push({name:"Raid Expert: Power Core",                    category:"Raids",subcategory:"General",stars:1,points:10,faction:"Both",description:"Complete the Fortress of Solitude: Power Core raid on Normal difficulty"});
  featCollection.push({name:"Raid Expert: Sunstone Matrix",               category:"Raids",subcategory:"General",stars:1,points:10,faction:"Both",description:"Complete the Fortress of Solitude: Sunstone Matrix raid on Normal difficulty"});

  featCollection.push({name:"No Time to Monkey Around",       category:"Alerts",subcategory:"Hard",stars:2,points:25,faction:"Both",description:"Complete the Strykers Prison Alert in 30 minutes or less"});
  featCollection.push({name:"Crazy Fast",                     category:"Alerts",subcategory:"Hard",stars:2,points:25,faction:"Both",description:"Beat the Arkham Asylum Alert in 30 minutes or less"});
  featCollection.push({name:"Nightmare Asylum",               category:"Alerts",subcategory:"Hard",stars:2,points:25,faction:"Both",description:"Defeat Dr Alyce Sinner's Nightmare and Scarecrow"});
  featCollection.push({name:"Freezer Burned",                 category:"Alerts",subcategory:"Hard",stars:2,points:25,faction:"Both",description:"Defeat Mister Freeze in 90 seconds or less"});
  featCollection.push({name:"Don't Fight the Power",          category:"Alerts",subcategory:"Hard",stars:2,points:25,faction:"Hero",description:"Defeat the Eradicator without destroying any drones"});
  featCollection.push({name:"Fast Responders",                category:"Alerts",subcategory:"Hard",stars:2,points:25,faction:"Hero",description:"Complete the Watchtower Containment Facility Alert in 30 minutes or less"});
  featCollection.push({name:"Smallville - Sightseer",         category:"Alerts",subcategory:"Hard",stars:2,points:25,faction:"Both",description:"Complete the Smallville Alert in 20 minutes or less"});
  featCollection.push({name:"Area 51 - Layover",              category:"Alerts",subcategory:"Hard",stars:2,points:25,faction:"Both",description:"Complete the Area 51 Alert in 20 minutes or less on hard mode"});
  featCollection.push({name:"Oolong Island - Layover",        category:"Alerts",subcategory:"Hard",stars:2,points:25,faction:"Both",description:"Complete the Oolong Island Alert in 20 minutes or less on hard mode"});
  featCollection.push({name:"HIVE Moonbase - Layover",        category:"Alerts",subcategory:"Hard",stars:2,points:25,faction:"Both",description:"Complete the Hive Moonbase Alert in 20 minutes or less on hard mode"});
  featCollection.push({name:"Quick n' Dirty",                 category:"Alerts",subcategory:"Hard",stars:2,points:25,faction:"Both",description:"Complete the Ace Chemicals Alert in 30 minutes or less"});
  featCollection.push({name:"Declawed",                       category:"Alerts",subcategory:"Hard",stars:2,points:25,faction:"Both",description:"Defeat all four Claws of the Demon"});
  featCollection.push({name:"The Question Finally Answered",  category:"Alerts",subcategory:"Hard",stars:1,points:10,faction:"Both",description:"Inspect all of the pirate bones scattered throughout the League Of Assassins fortress"});
  featCollection.push({name:"Go Ninja Go",                    category:"Alerts",subcategory:"Hard",stars:1,points:10,faction:"Both",description:"Complete the League Of Assassins stronghold in 30 minutes or less"});
  featCollection.push({name:"Alert: EMP PDQ",                 category:"Alerts",subcategory:"Hard",stars:1,points:10,faction:"Both",description:"Defeat the Outer Caverns alert in 45 minutes or less"});
  featCollection.push({name:"Safety is Job One",              category:"Alerts",subcategory:"Hard",stars:2,points:25,faction:"Both",description:"Defeat Sentinel DP-5 and Sentinel C-CU without getting stuck by special attacks"});
  featCollection.push({name:"Breaking the Chain of Command",  category:"Alerts",subcategory:"Hard",stars:2,points:25,faction:"Villain",description:"Defeat the Iron Statue before the Bronze Idol"});
  featCollection.push({name:"Quick System Restore",           category:"Alerts",subcategory:"Hard",stars:2,points:25,faction:"Villain",description:"Complete the Hall of Doom Armory Alert in 30 minutes or less"});

  featCollection.push({name:"Gorilla Island - Sightseer", category:"Alerts",subcategory:"Normal",stars:2,points:25,faction:"Both",description:"Complete the Gorilla Island Alert in 20 minutes or less"});
  featCollection.push({name:"Area 51 - Sightseer",        category:"Alerts",subcategory:"Normal",stars:2,points:25,faction:"Both",description:"Complete the Area 51 Alert in 20 minutes or less"});
  featCollection.push({name:"Bludhaven - Sightseer",      category:"Alerts",subcategory:"Normal",stars:2,points:25,faction:"Both",description:"Complete the Bluhaven Alert in 20 minutes or less"});
  featCollection.push({name:"Oolong Island - Sightseer",  category:"Alerts",subcategory:"Normal",stars:2,points:25,faction:"Both",description:"Complete the Oolong Island Alert in 20 minutes or less"});
  featCollection.push({name:"HIVE Moonbase - Sightseer",  category:"Alerts",subcategory:"Normal",stars:2,points:25,faction:"Both",description:"Complete the HIVE Moonbase Alert in 20 minutes or less"});

  featCollection.push({name:"Global Justice",             category:"Alerts",subcategory:"General",stars:3,points:50,faction:"Hero",description:"Complete all Alerts as a hero in the classic game"});
  featCollection.push({name:"Global Dominance",           category:"Alerts",subcategory:"General",stars:3,points:50,faction:"Villain",description:"Complete all Alerts as a villain in the classic game"});
  featCollection.push({name:"Alert Rookie",               category:"Alerts",subcategory:"General",stars:2,points:25,faction:"Both",description:"Complete 10 Alerts"});
  featCollection.push({name:"Alert Expert ",              category:"Alerts",subcategory:"General",stars:2,points:25,faction:"Both",description:"Complete 50 Alerts"});
  featCollection.push({name:"Alert Master",               category:"Alerts",subcategory:"General",stars:2,points:25,faction:"Both",description:"Complete 100 Alerts"});
  featCollection.push({name:"Emergency Responder",        category:"Alerts",subcategory:"General",stars:3,points:50,faction:"Both",description:"Complete 250 Alerts"});
  featCollection.push({name:"Alert! Alert! Alert!",       category:"Alerts",subcategory:"General",stars:3,points:50,faction:"Both",description:"Complete 500 Alerts"});

  featCollection.push({name:"All Trinked Out",                                       category:"Player vs Player",subcategory:"General",stars:1,points:10,faction:"Both",description:"Purchase a PvP Trinket"});
  featCollection.push({name:"Not So Fast!",                                          category:"Player vs Player",subcategory:"General",stars:1,points:10,faction:"Both",description:"Defeat a player in PvP while they are in a movement mode"});
  featCollection.push({name:"Assistance Is Not Futile",                              category:"Player vs Player",subcategory:"General",stars:1,points:10,faction:"Both",description:"Assist in the capture of 250 nodes during PvP matches"});
  featCollection.push({name:"Assist Master",                                         category:"Player vs Player",subcategory:"General",stars:1,points:10,faction:"Both",description:"Assist in the capture of 100 nodes during PvP matches"});
  featCollection.push({name:"Assist Expert",                                         category:"Player vs Player",subcategory:"General",stars:1,points:10,faction:"Both",description:"Assist in the capture of 50 nodes during PvP matches"});
  featCollection.push({name:"Assist Rookie",                                         category:"Player vs Player",subcategory:"General",stars:1,points:10,faction:"Both",description:"Assist in the capture of 10 nodes during PvP matches"});
  featCollection.push({name:"Hostile Takeover",                                      category:"Player vs Player",subcategory:"General",stars:1,points:10,faction:"Both",description:"Capture 250 nodes during PvP matches"});
  featCollection.push({name:"Capture Master",                                        category:"Player vs Player",subcategory:"General",stars:1,points:10,faction:"Both",description:"Capture 100 nodes during PvP matches"});
  featCollection.push({name:"Capture Expert",                                        category:"Player vs Player",subcategory:"General",stars:1,points:10,faction:"Both",description:"Capture 50 nodes during PvP matches"});
  featCollection.push({name:"Capture Rookie",                                        category:"Player vs Player",subcategory:"General",stars:1,points:10,faction:"Both",description:"Capture 10 nodes during PvP matches"});
  featCollection.push({name:"The System Is Down",                                    category:"Player vs Player",subcategory:"General",stars:1,points:10,faction:"Both",description:"Take 250 turrets offline in PvP Matches"});
  featCollection.push({name:"Offline Master",                                        category:"Player vs Player",subcategory:"General",stars:1,points:10,faction:"Both",description:"Take 100 turrets offline in PvP Matches"});
  featCollection.push({name:"Offline Expert",                                        category:"Player vs Player",subcategory:"General",stars:1,points:10,faction:"Both",description:"Take 25 turrets offline in PvP Matches"});
  featCollection.push({name:"Offline Rookie",                                        category:"Player vs Player",subcategory:"General",stars:1,points:10,faction:"Both",description:"Take 10 turrets offline in PvP Matches"});
  featCollection.push({name:"Fighting the Good Fight",                               category:"Player vs Player",subcategory:"General",stars:1,points:10,faction:"Both",description:"Win 1 Ring war or Diamond Heist PvP event"});
  featCollection.push({name:"Smelled Like Victory",                                  category:"Player vs Player",subcategory:"General",stars:1,points:10,faction:"Both",description:"Win 10 Ring War or Diamond Heist PVP event"});
  featCollection.push({name:"Give Them Nothing But Take From Them Everything",       category:"Player vs Player",subcategory:"General",stars:1,points:10,faction:"Both",description:"Win 25 Ring War or Diamond Heist PVP event"});
  featCollection.push({name:"War Never Changes",                                     category:"Player vs Player",subcategory:"General",stars:2,points:25,faction:"Both",description:"Win 50 Ring war or Diamond Heist PvP events"});
  featCollection.push({name:"There is No Substitute for Victory",                    category:"Player vs Player",subcategory:"General",stars:3,points:50,faction:"Both",description:"Win 100 Ring war or Diamond Heist PvP events"});
  featCollection.push({name:"Hunter for Hire",                                       category:"Player vs Player",subcategory:"General",stars:1,points:10,faction:"Both",description:"Complete 10 player Bounty missions"});
  featCollection.push({name:"Wanted: Knocked Out or Alive",                          category:"Player vs Player",subcategory:"General",stars:1,points:10,faction:"Both",description:"Complete 25 player Bounty missions"});
  featCollection.push({name:"WANTED: Knocked Out or Alive",                          category:"Player vs Player",subcategory:"General",stars:1,points:10,faction:"Both",description:"Complete 25 player Bounty missions"});
  featCollection.push({name:"Fistfull of Cash",                                      category:"Player vs Player",subcategory:"General",stars:2,points:25,faction:"Both",description:"Complete 50 player Bounty missions"});
  featCollection.push({name:"My Backpack's Got Jets",                                category:"Player vs Player",subcategory:"General",stars:3,points:50,faction:"Both",description:"Complete 250 player Bounty missions"});
  featCollection.push({name:"Give No Quarter",             category:"Player vs Player",subcategory:"General",stars:1,points:10,faction:"Both",description:"Obtain 25 marks of victory"});
  featCollection.push({name:"Man That's Harshad",          category:"Player vs Player",subcategory:"General",stars:2,points:25,faction:"Both",description:"Obtain 500 marks of victory"});
  featCollection.push({name:"Centurion",                   category:"Player vs Player",subcategory:"General",stars:2,points:25,faction:"Both",description:"Obtain 100 marks of victory"});
  featCollection.push({name:"A Grand Feat",                category:"Player vs Player",subcategory:"General",stars:3,points:50,faction:"Both",description:"Obtain 1000 marks of victory, Conquest, Tactics or Strategy"});


  featCollection.push({name:"Legendary Initiate",             category:"Player vs Player",subcategory:"Legendary Battles", stars:1,points:10,faction:"Both",description:"Achieve level 5 to begin Legendary Battles"});
  featCollection.push({name:"Getting the Band Back Together", category:"Player vs Player",subcategory:"Legendary Battles", stars:3,points:50,faction:"Both",description:"Unlock all the classic Legendary Battle Arena Avatars"});
  featCollection.push({name:"Legendary",                      category:"Player vs Player",subcategory:"Legendary Battles", stars:1,points:10,faction:"Both",description:"Win 10 Legendary Battles"});
  featCollection.push({name:"Living the Legend",              category:"Player vs Player",subcategory:"Legendary Battles", stars:2,points:25,faction:"Both",description:"Win one match in each Legendary Battle map in the classic game"});
  featCollection.push({name:"Breaking the Bat",               category:"Player vs Player",subcategory:"Legendary Battles", stars:2,points:25,faction:"Both",description:"Knock out Batman as Bane"});
  featCollection.push({name:"Death in the Family",            category:"Player vs Player",subcategory:"Legendary Battles", stars:2,points:25,faction:"Both",description:"Knock out Robin as the Joker wielding a crowbar"});
  featCollection.push({name:"Mad Love",                       category:"Player vs Player",subcategory:"Legendary Battles", stars:2,points:25,faction:"Both",description:"Knock out the Joker as Harley Quinn"});
  featCollection.push({name:"Legendary Winning Streak",       category:"Player vs Player",subcategory:"Legendary Battles", stars:3,points:50,faction:"Both",description:"Win 10 Legendary Battles in a row"});
  featCollection.push({name:"Penny Polisher",                 category:"Player vs Player",subcategory:"Legendary Battles", stars:1,points:10,faction:"Both",description:"Win 10 Batcave matches"});
  featCollection.push({name:"Batcave Battler",                category:"Player vs Player",subcategory:"Legendary Battles", stars:1,points:10,faction:"Both",description:"Win 50 Batcave matches"});
  featCollection.push({name:"Knight-in-Training",             category:"Player vs Player",subcategory:"Legendary Battles", stars:1,points:10,faction:"Both",description:"Win 100 Batcave matches"});
  featCollection.push({name:"Knight-Trained Duelist",         category:"Player vs Player",subcategory:"Legendary Battles", stars:3,points:50,faction:"Both",description:"Win 250 Batcave matches"});
  featCollection.push({name:"Vat Worker",                     category:"Player vs Player",subcategory:"Legendary Battles", stars:1,points:10,faction:"Both",description:"Win 10 Ace Chemicals matches"});
  featCollection.push({name:"Chemical Concocter",             category:"Player vs Player",subcategory:"Legendary Battles",stars:1,points:10,faction:"Both",description:"Win 50 Ace Chemicals matches"});
  featCollection.push({name:"Ace Attorney",                   category:"Player vs Player",subcategory:"Legendary Battles",stars:2,points:25,faction:"Both",description:"Win 100 Ace Chemicals matches"});
  featCollection.push({name:"Ace Executive",                  category:"Player vs Player",subcategory:"Legendary Battles",stars:3,points:50,faction:"Both",description:"Win 250 Ace Chemicals matches"});
  featCollection.push({name:"A Serious House",                category:"Player vs Player",subcategory:"Legendary Battles", stars:1,points:10,faction:"Both",description:"Knock out an iconic Arkham Asylum inmate on the Arkham map"});
  featCollection.push({name:"Arkham Intern",                  category:"Player vs Player",subcategory:"Legendary Battles", stars:1,points:10,faction:"Both",description:"Win 10 Arkham Asylum matches"});
  featCollection.push({name:"Arkham Attendant",               category:"Player vs Player",subcategory:"Legendary Battles",stars:1,points:10,faction:"Both",description:"Win 50 Arkham Asylum matches"});
  featCollection.push({name:"Arkham Doctor",                  category:"Player vs Player",subcategory:"Legendary Battles",stars:2,points:25,faction:"Both",description:"Win 100 Arkham Asylum matches"});
  featCollection.push({name:"Arkham Administrator",           category:"Player vs Player",subcategory:"Legendary Battles",stars:3,points:50,faction:"Both",description:"Win 250 Arkham Asylum matches"});

  featCollection.push({name:"Arena Master",                                      category:"Player vs Player",subcategory:"Arenas",stars:1,points:10,faction:"Both",description:"Win 10 normal arena matches"});
  featCollection.push({name:"Global Enforcer",                                   category:"Player vs Player",subcategory:"Arenas",stars:2,points:25,faction:"Both",description:"Win one match in each arena map in the classic game"});
  featCollection.push({name:"PvP MVP",                                           category:"Player vs Player",subcategory:"Arenas",stars:2,points:25,faction:"Both",description:"Win an arena match with no deaths and 10 captures"});
  featCollection.push({name:"Think Fast!",                                       category:"Player vs Player",subcategory:"Arenas",stars:2,points:25,faction:"Both",description:"Win an arena match in 5 minutes or less"});
  featCollection.push({name:"Winning Streak X",                                  category:"Player vs Player",subcategory:"Arenas",stars:3,points:50,faction:"Both",description:"Win 10 matches on the arena maps in a row"});
  featCollection.push({name:"High Rolling Healer",                               category:"Player vs Player",subcategory:"Arenas",stars:2,points:25,faction:"Both",description:"Heal 100,000 damage or more in a single arena match"});
  featCollection.push({name:"Attack the Weak Point for Massive Damage",          category:"Player vs Player",subcategory:"Arenas",stars:2,points:25,faction:"Both",description:"Do 100,000 damage or more in a single arena match"});
  featCollection.push({name:"Gotta Catch Em' All!",                              category:"Player vs Player",subcategory:"Arenas",stars:2,points:25,faction:"Both",description:"Knock out one player of each power type in the arena"});
  featCollection.push({name:"25X Under Fire!",                                   category:"Player vs Player",subcategory:"Arenas",stars:1,points:10,faction:"Both",description:"Reach 25 hits on the hit counter in PvP arena"});
  featCollection.push({name:"10X Under Fire!",                                   category:"Player vs Player",subcategory:"Arenas",stars:1,points:10,faction:"Both",description:"Reach 10 hits on the hit counter in PvP arena"});
  featCollection.push({name:"Crush Your Enemies and See Them Driven Before You", category:"Player vs Player",subcategory:"Arenas",stars:3,points:50,faction:"Both",description:"Knock out 10000 enemy players in arena matches"});
  featCollection.push({name:"Killing Is My Business, and Business Is Good",      category:"Player vs Player",subcategory:"Arenas",stars:2,points:25,faction:"Both",description:"Knock out 5000 enemy players in arena matches"});
  featCollection.push({name:"1000 Down for the Count",                           category:"Player vs Player",subcategory:"Arenas",stars:2,points:25,faction:"Both",description:"Knock out 1000 enemy players in arena matches"});
  featCollection.push({name:"500 Down for the Count",                            category:"Player vs Player",subcategory:"Arenas",stars:1,points:10,faction:"Both",description:"Knock out 500 enemy players in arena matches"});
  featCollection.push({name:"100 Down for the Count",                            category:"Player vs Player",subcategory:"Arenas",stars:1,points:10,faction:"Both",description:"Knock out 100 enemy players in arena matches"});
  featCollection.push({name:"25 Down for the Count",                             category:"Player vs Player",subcategory:"Arenas",stars:1,points:10,faction:"Both",description:"Knock out 25 enemy players in arena matches"});
  featCollection.push({name:"Down for the Count",                                category:"Player vs Player",subcategory:"Arenas",stars:1,points:10,faction:"Both",description:"Knock out an enemy player in an arena match"});
  featCollection.push({name:"One Giant Beating for Mankind",                     category:"Player vs Player",subcategory:"Arenas",stars:3,points:50,faction:"Both",description:"Win 250 arena matches on the Moon"});
  featCollection.push({name:"Moon Base Master",                                  category:"Player vs Player",subcategory:"Arenas",stars:2,points:25,faction:"Both",description:"Win 100 arena matches on the Moon"});
  featCollection.push({name:"Moon Base Expert",                                  category:"Player vs Player",subcategory:"Arenas",stars:1,points:10,faction:"Both",description:"Win 50 arena matches on the Moon"});
  featCollection.push({name:"Moon Base Rookie",                                  category:"Player vs Player",subcategory:"Arenas",stars:1,points:10,faction:"Both",description:"Win 10 arena matches on the Moon"});
  featCollection.push({name:"UNKNOWN",                                           category:"Player vs Player",subcategory:"Arenas",stars:3,points:50,faction:"Both",description:"Win 250 arena matches in the outback"});
  featCollection.push({name:"Outback Master",                                    category:"Player vs Player",subcategory:"Arenas",stars:2,points:25,faction:"Both",description:"Win 100 arena matches in the outback"});
  featCollection.push({name:"Outback Expert",                                    category:"Player vs Player",subcategory:"Arenas",stars:1,points:10,faction:"Both",description:"Win 50 arena matches in the outback"});
  featCollection.push({name:"Outback Rookie",                                    category:"Player vs Player",subcategory:"Arenas",stars:1,points:10,faction:"Both",description:"Win 10 arena matches in the outback"});
  featCollection.push({name:"All in the Name of Science",                        category:"Player vs Player",subcategory:"Arenas",stars:3,points:50,faction:"Both",description:"Win 250 arena matches in STAR Labs"});
  featCollection.push({name:"STAR Labs Master",                                  category:"Player vs Player",subcategory:"Arenas",stars:2,points:25,faction:"Both",description:"Win 100 arena matches in STAR Labs"});
  featCollection.push({name:"STAR Labs Expert",                                  category:"Player vs Player",subcategory:"Arenas",stars:1,points:10,faction:"Both",description:"Win 50 arena matches in STAR Labs"});
  featCollection.push({name:"STAR Labs Rookie",                                  category:"Player vs Player",subcategory:"Arenas",stars:1,points:10,faction:"Both",description:"Win 10 arena matches in STAR Labs"});
  featCollection.push({name:"Come At Me!",                                       category:"Player vs Player",subcategory:"Arenas",stars:1,points:10,faction:"Both",description:"Defeat 50 opponents in a single arena game"});
  featCollection.push({name:"Place Your Bets!",                                  category:"Player vs Player",subcategory:"Arenas",stars:2,points:25,faction:"Both",description:"Defeat 25 opponents in a single arena game"});
  featCollection.push({name:"M-M-Multi KO!",                                     category:"Player vs Player",subcategory:"Arenas",stars:2,points:25,faction:"Both",description:"Achieve a streak of 25 KO's before being KO'd in an arena match"});
  featCollection.push({name:"KO Spree!",                                         category:"Player vs Player",subcategory:"Arenas",stars:1,points:10,faction:"Both",description:"Achieve a streak of 5 KOs before being KO'd in an arena match"});

  featCollection.push({name:"Threw Down the Gauntlet",  category:"Player vs Player",subcategory:"Dueling",stars:1,points:10,faction:"Both",description:"Win a duel"});
  featCollection.push({name:"Send 'em Packing",         category:"Player vs Player",subcategory:"Dueling",stars:1,points:10,faction:"Both",description:"Dominate a duel"});
  featCollection.push({name:"Close Call",               category:"Player vs Player",subcategory:"Dueling",stars:1,points:10,faction:"Both",description:"Win a duel by the skin of your teeth!"});
  featCollection.push({name:"On the Ropes",             category:"Player vs Player",subcategory:"Dueling",stars:1,points:10,faction:"Both",description:"Participate in 100 duels"});
  featCollection.push({name:"You Seem a Decent Fellow", category:"Player vs Player",subcategory:"Dueling",stars:1,points:10,faction:"Both",description:"Win 50 duels"});
  featCollection.push({name:"Not Just Another Bum",     category:"Player vs Player",subcategory:"Dueling",stars:1,points:10,faction:"Both",description:"Participate in 300 duels"});
  featCollection.push({name:"The Brute Squad",          category:"Player vs Player",subcategory:"Dueling",stars:1,points:10,faction:"Both",description:"Win 250 duels"});
  featCollection.push({name:"Eye of the Fighter",       category:"Player vs Player",subcategory:"Dueling",stars:2,points:25,faction:"Both",description:"Participate in 500 duels"});
  featCollection.push({name:"Humdinger",                category:"Player vs Player",subcategory:"Dueling",stars:1,points:10,faction:"Both",description:"Dominate 100 duels"});
  featCollection.push({name:"To the Pain!",             category:"Player vs Player",subcategory:"Dueling",stars:2,points:25,faction:"Both",description:"Win 500 duels"});
  featCollection.push({name:"Heart-Stopper",            category:"Player vs Player",subcategory:"Dueling",stars:1,points:10,faction:"Both",description:"Win 100 duels by the skin of your teeth!"});
  featCollection.push({name:"Went the Distance",        category:"Player vs Player",subcategory:"Dueling",stars:2,points:25,faction:"Both",description:"Participate in 1000 duels"});
  featCollection.push({name:"Sting Like Queen Bee",     category:"Player vs Player",subcategory:"Dueling",stars:2,points:25,faction:"Both",description:"Dominate 250 duels"});
  featCollection.push({name:"Inconceivable!",           category:"Player vs Player",subcategory:"Dueling",stars:2,points:25,faction:"Both",description:"Win 1000 duels"});
  featCollection.push({name:"Float Like a Thanagarian", category:"Player vs Player",subcategory:"Dueling",stars:2,points:25,faction:"Both",description:"Win 250 duels by the skin of your teeth!"});

  featCollection.push({name:"Duos Rookie",        category:"Duos",subcategory:"General",stars:1,points:10,faction:"Both",description:"Complete 10 Duos"});
  featCollection.push({name:"Duos Expert",        category:"Duos",subcategory:"General",stars:1,points:10,faction:"Both",description:"Complete 50 Duos"});
  featCollection.push({name:"Duos Master",        category:"Duos",subcategory:"General",stars:1,points:10,faction:"Both",description:"Complete 100 Duos"});
  featCollection.push({name:"Duos Dynamo",        category:"Duos",subcategory:"General",stars:2,points:25,faction:"Both",description:"Complete 250 Duos"});
  featCollection.push({name:"Dynamic",            category:"Duos",subcategory:"General",stars:3,points:50,faction:"Both",description:"Complete 500 Duos"});
  featCollection.push({name:"Debugging Duos",     category:"Duos",subcategory:"General",stars:2,points:25,faction:"Hero",description:"Discover Ambush Bug in every Classic Duo Mode"});
  featCollection.push({name:"Quit Buggin' Me",    category:"Duos",subcategory:"General",stars:2,points:25,faction:"Villain",description:"Discover Ambush Bug in every Classic Duo Mode"});
  featCollection.push({name:"Double Deliverance", category:"Duos",subcategory:"General",stars:2,points:25,faction:"Hero",description:"Complete all Duo Modes as hero in the classic game"});
  featCollection.push({name:"Double Destruction", category:"Duos",subcategory:"General",stars:2,points:25,faction:"Villain",description:"Complete all Duo Modes as villain in the classic game"});

  featCollection.push({name:"Zephyr Winds",       category:"Duos",subcategory:"Speed Force",stars:1,points:10,faction:"Both",description:"Complete the Gotham University Duo in 10 minutes or less"});
  featCollection.push({name:"Busy Bee",           category:"Duos",subcategory:"Speed Force",stars:1,points:10,faction:"Both",description:"Complete the Hive Base Duo in 10 minutes or less"});
  featCollection.push({name:"Gorilla Hustle",     category:"Duos",subcategory:"Speed Force",stars:1,points:10,faction:"Both",description:"Complete the Gorilla Grodd Lab Duo in 8 minutes or less"});
  featCollection.push({name:"OMAC Velocity",      category:"Duos",subcategory:"Speed Force",stars:1,points:10,faction:"Both",description:"Complete the OMAC Base Duo in 11 minutes or less"});
  featCollection.push({name:"Venom Rush",         category:"Duos",subcategory:"Speed Force",stars:1,points:10,faction:"Both",description:"Complete the Cape Carmine Lighthouse Duo in 10 minutes or less"});
  featCollection.push({name:"Speedy Coin",        category:"Duos",subcategory:"Speed Force",stars:1,points:10,faction:"Both",description:"Complete the Old Gotham Subway Duo in 11 minutes or less"});
  featCollection.push({name:"Light Speed Ahead",  category:"Duos",subcategory:"Speed Force",stars:1,points:10,faction:"Both",description:"Complete the Metropolis City Hall Duo in 8 minutes or less"});
  featCollection.push({name:"Lightcrusher",       category:"Duos",subcategory:"Speed Force",stars:1,points:10,faction:"Both",description:"Defeat Arkillo/Kilowog after allowing him to reach 5x power"});
  featCollection.push({name:"Faster Than Light",  category:"Duos",subcategory:"Speed Force",stars:1,points:10,faction:"Both",description:"Defeat Arkillo/Kilowog before the drudges power ups his ring once"});
  featCollection.push({name:"Arctic Breeze",      category:"Duos",subcategory:"Speed Force",stars:1,points:10,faction:"Villain",description:"Defeat the Gotham Mercy Hospital Villain Duo in 8 minutes or less"});
  featCollection.push({name:"Freeze!",            category:"Duos",subcategory:"Speed Force",stars:1,points:10,faction:"Villain",description:"Defeat Mister Freeze's two remaining goons in Mercy Hospital"});

  featCollection.push({name:"Research Assistant",       category:"R&D",subcategory:"General",stars:1,points:10,faction:"Both",description:"Research 50 different plans"});
  featCollection.push({name:"Journeyman Technician",    category:"R&D",subcategory:"General",stars:2,points:25,faction:"Both",description:"Research 100 different plans"});
  featCollection.push({name:"The Man With The Plans",   category:"R&D",subcategory:"General",stars:3,points:50,faction:"Both",description:"Research 150 different plans"});

  featCollection.push({name:"Soder Jerk",               category:"R&D",subcategory:"Assembly",stars:1,points:10,faction:"Both",description:"Create a variety pack of enhanced Soder Colas"});
  featCollection.push({name:"The Soder Challenge",      category:"R&D",subcategory:"Assembly",stars:2,points:25,faction:"Both",description:"Create a variety pack of enhanced Soder Cola Mark II's"});
  featCollection.push({name:"Soder Machine",            category:"R&D",subcategory:"Assembly",stars:3,points:50,faction:"Both",description:"Create a variety pack of enhanced Soder Cola Mark III's"});
  featCollection.push({name:"I Made This!",             category:"R&D",subcategory:"Assembly",stars:1,points:10,faction:"Both",description:"Create 10 items"});
  featCollection.push({name:"Some Assembly Required",   category:"R&D",subcategory:"Assembly",stars:1,points:10,faction:"Both",description:"Create 100 items"});
  featCollection.push({name:"DIY",                      category:"R&D",subcategory:"Assembly",stars:2,points:25,faction:"Both",description:"Create 500 items"});
  featCollection.push({name:"In Development",           category:"R&D",subcategory:"Assembly",stars:2,points:25,faction:"Both",description:"Create 1000 items"});
  featCollection.push({name:"Crafty, Aren't Ya?",       category:"R&D",subcategory:"Assembly",stars:3,points:50,faction:"Both",description:"Create 2500 items"});
  featCollection.push({name:"Makin' Copies",            category:"R&D",subcategory:"Assembly",stars:3,points:50,faction:"Both",description:"Create 5000 items"});
  featCollection.push({name:"Assembly Line",            category:"R&D",subcategory:"Assembly",stars:3,points:50,faction:"Both",description:"Create 7500 items"});
  featCollection.push({name:"Entering Mass Production", category:"R&D",subcategory:"Assembly",stars:3,points:50,faction:"Both",description:"Create 10000 items"});

  featCollection.push({name:"Break It Down",                category:"R&D",subcategory:"Parts",stars:1,points:10,faction:"Both",description:"Salvage 10 items"});
  featCollection.push({name:"Yes, Disassemble",             category:"R&D",subcategory:"Parts",stars:1,points:10,faction:"Both",description:"Salvage 100 items"});
  featCollection.push({name:"Pick 'n Pull",                 category:"R&D",subcategory:"Parts",stars:2,points:25,faction:"Both",description:"Salvage 500 items"});
  featCollection.push({name:"Parting It Out",               category:"R&D",subcategory:"Parts",stars:2,points:25,faction:"Both",description:"Salvage 1000 items"});
  featCollection.push({name:"Junkyard Warrior",             category:"R&D",subcategory:"Parts",stars:3,points:50,faction:"Both",description:"Salvage 2500 items"});
  featCollection.push({name:"Parts Direct",                 category:"R&D",subcategory:"Parts",stars:3,points:50,faction:"Both",description:"Salvage 5000 items"});
  featCollection.push({name:"Master of Disassembly",        category:"R&D",subcategory:"Parts",stars:3,points:50,faction:"Both",description:"Salvage 7500 items"});
  featCollection.push({name:"Parting Is Such Sweet Sorrow", category:"R&D",subcategory:"Parts",stars:3,points:50,faction:"Both",description:"Salvage 10000 items"});
  featCollection.push({name:"Ooh, Shiny!",                  category:"R&D",subcategory:"Parts",stars:1,points:10,faction:"Both",description:"Gather 10 items"});
  featCollection.push({name:"Beach Comber",                 category:"R&D",subcategory:"Parts",stars:1,points:10,faction:"Both",description:"Gather 250 items"});
  featCollection.push({name:"Panning For Parts",            category:"R&D",subcategory:"Parts",stars:1,points:10,faction:"Both",description:"Gather 1000 items"});
  featCollection.push({name:"Follow Your Nodes",            category:"R&D",subcategory:"Parts",stars:2,points:25,faction:"Both",description:"Gather 5000 items"});
  featCollection.push({name:"Nodeworthy",                   category:"R&D",subcategory:"Parts",stars:2,points:25,faction:"Both",description:"Gather 10000 items"});
  featCollection.push({name:"Seek & Find",                  category:"R&D",subcategory:"Parts",stars:3,points:50,faction:"Both",description:"Gather 15000 items"});
  featCollection.push({name:"Hunter-Gatherer",              category:"R&D",subcategory:"Parts",stars:3,points:50,faction:"Both",description:"Gather 20000 items"});
  featCollection.push({name:"Tragic, The Gathering",        category:"R&D",subcategory:"Parts",stars:3,points:50,faction:"Both",description:"Gather 250000 items"});

  featCollection.push({name:"Sentinels of Magic: Cooperative ", category:"Renown",subcategory:"Heroes",stars:1,points:10,faction:"Hero",description:"Achieve Cooperative status with the Sentinels of Magic"});
  featCollection.push({name:"Sentinels of Magic: Friendly",     category:"Renown",subcategory:"Heroes",stars:1,points:10,faction:"Hero",description:"Achieve Friendly status with the Sentinels of Magic"});
  featCollection.push({name:"Sentinels of Magic: Favorable",    category:"Renown",subcategory:"Heroes",stars:2,points:25,faction:"Hero",description:"Achieve Favorable status with the Sentinels of Magic"});
  featCollection.push({name:"Protector of Knowledge",           category:"Renown",subcategory:"Heroes",stars:2,points:25,faction:"Hero",description:"Achieve Trusted status with the Sentinels of Magic"});
  featCollection.push({name:"STAR Labs: Cooperative",           category:"Renown",subcategory:"Heroes",stars:1,points:10,faction:"Hero",description:"Achieve Cooperative status with STAR Labs"});
  featCollection.push({name:"STAR Labs: Friendly",              category:"Renown",subcategory:"Heroes",stars:1,points:10,faction:"Hero",description:"Achieve Friendly status with STAR Labs"});
  featCollection.push({name:"STAR Labs: Favorable",             category:"Renown",subcategory:"Heroes",stars:2,points:25,faction:"Hero",description:"Achieve Favorable status with STAR Labs"});
  featCollection.push({name:"Science STAR",                     category:"Renown",subcategory:"Heroes",stars:2,points:25,faction:"Hero",description:"Achieve Trusted status with STAR Labs"});
  featCollection.push({name:"WayneTech: Cooperative ",          category:"Renown",subcategory:"Heroes",stars:1,points:10,faction:"Hero",description:"Achieve Cooperative status with WayneTech"});
  featCollection.push({name:"WayneTech: Friendly",              category:"Renown",subcategory:"Heroes",stars:1,points:10,faction:"Hero",description:"Achieve Friendly status with WayneTech"});
  featCollection.push({name:"WayneTech: Favorable",             category:"Renown",subcategory:"Heroes",stars:2,points:25,faction:"Hero",description:"Achieve Favorable status with WayneTech"});
  featCollection.push({name:"Head of Research",                 category:"Renown",subcategory:"Heroes",stars:2,points:25,faction:"Hero",description:"Achieve Trusted status with WayneTech"});
  featCollection.push({name:"Cult of Trigon: Cooperative",      category:"Renown",subcategory:"Villains",stars:1,points:10,faction:"Villain",description:"Achieve Cooperative status with the Cult of Trigon"});
  featCollection.push({name:"Cult of Trigon: Friendly",         category:"Renown",subcategory:"Villains",stars:1,points:10,faction:"Villain",description:"Achieve Friendly status with the Cult of Trigon"});
  featCollection.push({name:"Cult of Trigon: Favorable",        category:"Renown",subcategory:"Villains",stars:2,points:25,faction:"Villain",description:"Achieve Favorable status with the Cult of Trigon"});
  featCollection.push({name:"Devoted to the Demon",             category:"Renown",subcategory:"Villains",stars:2,points:25,faction:"Villain",description:"Achieve Trusted status with the Cult of Trigon"});
  featCollection.push({name:"LexCorp: Cooperative",             category:"Renown",subcategory:"Villains",stars:1,points:10,faction:"Villain",description:"Achieve Cooperative status with LexCorp"});
  featCollection.push({name:"LexCorp: Friendly",                category:"Renown",subcategory:"Villains",stars:1,points:10,faction:"Villain",description:"Achieve Friendly status with LexCorp"});
  featCollection.push({name:"LexCorp: Favorable",               category:"Renown",subcategory:"Villains",stars:2,points:25,faction:"Villain",description:"Achieve Favorable status with LexCorp"});
  featCollection.push({name:"VP of Villainy",                   category:"Renown",subcategory:"Villains",stars:2,points:25,faction:"Villain",description:"Achieve Trusted status with LexCorp"});
  featCollection.push({name:"Rogues: Cooperative",              category:"Renown",subcategory:"Villains",stars:1,points:10,faction:"Villain",description:"Achieve Cooperative status with the Rogues"});
  featCollection.push({name:"Rogues: Friendly",                 category:"Renown",subcategory:"Villains",stars:1,points:10,faction:"Villain",description:"Achieve Friendly status with the Rogues"});
  featCollection.push({name:"Rogues: Favorable",                category:"Renown",subcategory:"Villains",stars:2,points:25,faction:"Villain",description:"Achieve Favorable status with the Rogues"});
  featCollection.push({name:"Villainous Rogue",                 category:"Renown",subcategory:"Villains",stars:2,points:25,faction:"Villain",description:"Achieve Trusted status with the Rogues"});

  featCollection.push({name:"Determined",                                category:"Solo",subcategory:"General",stars:1,points:10,faction:"Both",description:"Complete any classic game episode-ending playroom without being KO'd"});
  featCollection.push({name:"Challenges Met, Enemies Defeated",          category:"Solo",subcategory:"General",stars:2,points:25,faction:"Villain",description:"Complete all classic Challenge Mode hideouts available to villains"});
  featCollection.push({name:"No Challenge Too Great",                    category:"Solo",subcategory:"General",stars:1,points:10,faction:"Hero",description:"Complete all classic Challenge Mode hideouts available to heroes"});
  featCollection.push({name:"Batteries Not Included",                    category:"Solo",subcategory:"General",stars:1,points:10,faction:"Villain",description:"Complete all of the Stryker's Island Toyman challenges as a villain"});
  featCollection.push({name:"Keep Out Of Reach Of Children",             category:"Solo",subcategory:"General",stars:1,points:10,faction:"Hero",description:"Complete all of the Stryker's Island Toyman Challenges as a hero"});
  featCollection.push({name:"Fun for All Ages",                          category:"Solo",subcategory:"General",stars:1,points:10,faction:"Both",description:"Complete 10 daily Toyman missions"});
  featCollection.push({name:"And You Have a Date with Death!",           category:"Solo",subcategory:"General",stars:1,points:10,faction:"Both",description:"Complete 25 daily Toyman missions"});
  featCollection.push({name:"They're Not Dolls, They're Action Figures", category:"Solo",subcategory:"General",stars:1,points:10,faction:"Both",description:"Complete 50 daily Toyman missions"});
  featCollection.push({name:"To Infinity and Beyond",                    category:"Solo",subcategory:"General",stars:2,points:25,faction:"Both",description:"Complete 100 daily Toyman missions"});
  featCollection.push({name:"Messenger",                                 category:"Solo",subcategory:"General",stars:1,points:10,faction:"Both",description:"Complete 10 missions"});
  featCollection.push({name:"Herald",                                    category:"Solo",subcategory:"General",stars:1,points:10,faction:"Both",description:"Complete 25 missions"});
  featCollection.push({name:"Emissary",                                  category:"Solo",subcategory:"General",stars:1,points:10,faction:"Both",description:"Complete 50 missions"});
  featCollection.push({name:"Ambassador",                                category:"Solo",subcategory:"General",stars:1,points:10,faction:"Both",description:"Complete 100 missions"});
  featCollection.push({name:"Harbinger",                                 category:"Solo",subcategory:"General",stars:1,points:10,faction:"Both",description:"Complete 250 Missions"});
  featCollection.push({name:"Challenge Rookie",                          category:"Solo",subcategory:"General",stars:1,points:10,faction:"Both",description:"Complete 10 Challenges"});
  featCollection.push({name:"Challenge Expert",                          category:"Solo",subcategory:"General",stars:1,points:10,faction:"Both",description:"Complete 50 Challenges"});
  featCollection.push({name:"Challenge Master",                          category:"Solo",subcategory:"General",stars:1,points:10,faction:"Both",description:"Complete 100 Challenges"});
  featCollection.push({name:"Challenge Dynamo",                          category:"Solo",subcategory:"General",stars:2,points:25,faction:"Both",description:"Complete 250 Challenges"});
  featCollection.push({name:"Danger is My Trade",                        category:"Solo",subcategory:"General",stars:3,points:50,faction:"Both",description:"Complete 500 Challenges"});

  featCollection.push({name:"School of Hard Knocks: Giganta",       category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Both",description:"Defeat Giganta without using any consumable items or supercharge abilities"});
  featCollection.push({name:"School of Hard Knocks: Deathstroke",   category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Both",description:"Defeat Deathstroke without using any consumable items or supercharge abilities"});
  featCollection.push({name:"School of Hard Knocks: Brother Eye",   category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Both",description:"Defeat Brother Eye without using any consumable items or supercharge abilities"});
  featCollection.push({name:"School of Hard Knocks: Scarecrow",     category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Both",description:"Defeat Scarecrow without using any consumable items or supercharge abilities"});
  featCollection.push({name:"School of Hard Knocks: Isis",          category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Both",description:"Defeat Isis without using any consumable items or supercharge abilities"});
  featCollection.push({name:"School of Hard Knocks: Felix Faust",   category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Both",description:"Defeat Felix Faust without using any consumable items or supercharge abilities"});
  featCollection.push({name:"School of Hard Knocks: Brother Blood", category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Both",description:"Defeat Brother Blood without using any consumable items or supercharge abilities"});
  featCollection.push({name:"School of Hard Knocks: Poison Ivy",    category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Both",description:"Defeat Poison Ivy without using any consumable items or supercharge abilities"});
  featCollection.push({name:"School of Hard Knocks: Circe",         category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Both",description:"Defeat Circe without using any consumable items or supercharge abilities"});
  featCollection.push({name:"School of Hard Knocks: Raven",         category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Both",description:"Defeat Raven without using any consumable items or supercharge abilities"});
  featCollection.push({name:"School of Hard Knocks: Sinestro",      category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Both",description:"Defeat Sinestro without using any consumable items or supercharge abilities"});
  featCollection.push({name:"School of Hard Knocks: Aquaman",       category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Both",description:"Defeat Aquaman without using any consumable items or supercharge abilities"});
  featCollection.push({name:"School of Hard Knocks: Lex Luthor",    category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Both",description:"Defeat Lex Luthor without using any consumable items or supercharge abilities"});
  featCollection.push({name:"School of Hard Knocks: Robot Batman",  category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Hero",description:"Defeat Robot Batman without using any consumable items or supercharge abilities"});
  featCollection.push({name:"School of Hard Knocks: Doctor Psycho", category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Both",description:"Defeat Doctor Psycho in your final battle without using any consumable items or supercharge abilities"});
  featCollection.push({name:"School of Hard Knocks: Harley Quinn",  category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Both",description:"Defeat Harley Quinn without using any consumable items or supercharge abilities"});
  featCollection.push({name:"School of Hard Knocks: Joker",         category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Both",description:"Defeat The Joker without using any consumable items or supercharge abilities"});
  featCollection.push({name:"School of Hard Knocks: Gorilla Grodd", category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Both",description:"Defeat Gorilla Grodd without using any consumable items or supercharge abilities"});
  featCollection.push({name:"School of Hard Knocks: Queen Bee",     category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Both",description:"Defeat Queen Bee without using any consumable items or supercharge abilities"});
  featCollection.push({name:"School of Hard Knocks: Bane",          category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Both",description:"Defeat Bane without using any consumable items or supercharge abilities"});
  featCollection.push({name:"School of Hard Knocks: Catwoman",      category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Both",description:"Defeat Catwoman without using any consumable items or supercharge abilities"});
  featCollection.push({name:"School of Hard Knocks: Spectre",       category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Both",description:"Defeat Spectre without using any consumable items or supercharge abilities"});
  featCollection.push({name:"School of Hard Knocks: Bruno Mannheim",category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Both",description:"Defeat Bruno Mannheim without using any consumable items or supercharge abilities"});
  featCollection.push({name:"School of Hard Knocks: The Penguin",   category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Both",description:"Defeat The Penguin without using any consumable items or supercharge abilities"});
  featCollection.push({name:"School of Hard Knocks: The Flash",     category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Villain",description:"Defeat The Flash without using any consumable items or supercharge abilities"});
  featCollection.push({name:"School of Hard Knocks: Wonder Girl",   category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Villain",description:"Defeat Wonder Girl without using any consumable items or supercharge abilities"});
  featCollection.push({name:"School of Hard Knocks: Power Girl",    category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Villain",description:"Defeat Power Girl without using any consumable items or supercharge abilities"});
  featCollection.push({name:"School of Hard Knocks: Doctor Fate",   category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Villain",description:"Defeat Doctor Fate without using any consumable items or supercharge abilities"});
  featCollection.push({name:"School of Hard Knocks: Supergirl",     category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Villain",description:"Defeat Supergirl without using any consumable items or supercharge abilities"});
  featCollection.push({name:"School of Hard Knocks: Mister Freeze", category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Villain",description:"Defeat Mister Freeze without using any consumable items or supercharge abilities"});
  featCollection.push({name:"School of Hard Knocks: Wonder Woman",  category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Villain",description:"Defeat Wonder Woman without using any consumable items or supercharge abilities"});
  featCollection.push({name:"School of Hard Knocks: Robin",         category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Villain",description:"Defeat Robin without using any consumable items or supercharge abilities"});
  featCollection.push({name:"School of Hard Knocks: The Titans",    category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Villain",description:"Defeat The Titans without using any consumable items or supercharge abilities"});
  featCollection.push({name:"School of Hard Knocks: Zatanna",       category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Villain",description:"Defeat Zatanna without using any consumable items or supercharge abilities"});
  featCollection.push({name:"School of Hard Knocks: Huntress",      category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Villain",description:"Defeat Huntress without using any consumable items or supercharge abilities"});
  featCollection.push({name:"School of Hard Knocks: Alan Scott",    category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Villain",description:"Defeat Alan Scott without using any consumable items or supercharge abilities"});
  featCollection.push({name:"School of Hard Knocks: Batman",        category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Villain",description:"Defeat Batman without using any consumable items or supercharge abilities"});
  featCollection.push({name:"School of Hard Knocks: Robot Joker",   category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Villain",description:"Defeat Robot Joker without using any consumable items or supercharge abilities"});
  featCollection.push({name:"School of Hard Knocks: Superman",      category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Villain",description:"Defeat Superman without using any consumable items or supercharge abilities"});
  featCollection.push({name:"School of Hard Knocks: John Stewart",  category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Villain",description:"Defeat John Stewart without using any consumable items or supercharge abilities"});
  featCollection.push({name:"Fire Falls!",                          category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Villain",description:"Defeat Fire in Gotham's Otisburg Neighborhood"});
  featCollection.push({name:"Killer Frost Falls!",                  category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Hero",description:"Defeat Killer Frost in Gotham's Otisburg Neighborhood"});
  featCollection.push({name:"General Kordax Falls!",                category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Hero",description:"Defeat General Kordax in Metropolis's Suicide Slums"});
  featCollection.push({name:"Bizarro Falls!",                       category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Hero",description:"Defeat Bizarro at the Metro General Hospital in Little Bohemia"});
  featCollection.push({name:"Nepheritos Falls!",                    category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Hero",description:"Defeat Nepheritos in Gotham's Burnley Neighbourhood"});
  featCollection.push({name:"The Judge Falls!",                     category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Hero",description:"Defeat The Judge in Downtown Metropolis"});
  featCollection.push({name:"Clayface Clobbered!",                  category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Hero",description:"Defeat Clayface in Gotham's Otisburg Neighbourhood"});
  featCollection.push({name:"Arkillo Falls!",                       category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Hero",description:"Defeat Arkillo in the Metropolis Historic District"});
  featCollection.push({name:"Avatar of Sin Falls!",                 category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Hero",description:"Defeat the Avatar of Sin in Midtown Metropolis"});
  featCollection.push({name:"Minotaur Falls!",                      category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Hero",description:"Defeat Minotaur in the Tomorrow District of Metropolis"});
  featCollection.push({name:"Solomon Grundy Falls!",                category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Hero",description:"Defeat Solomon Grundy in Gotham's Otisburg Neighbourhood"});
  featCollection.push({name:"Full House Falls!",                    category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Hero",description:"Defeat Full House near Gotham's Amusement Mile"});
  featCollection.push({name:"Hawkman and Hawkgirl Fall!",           category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Villain",description:"Defeat Hawkman and Hawkgirl in Metropolis near the Old STAR Labs building"});
  featCollection.push({name:"Power Girl Falls!",                    category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Villain",description:"Defeat Power Girl in Downtown Metropolis"});
  featCollection.push({name:"Enchanted Statue Falls!",              category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Villain",description:"Defeat the Enchanted Statue in Metropolis's Tomorrow District"});
  featCollection.push({name:"Doctor Fate Falls!",                   category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Villain",description:"Defeat Doctor Fate near the Metropolis Cain Street Mall"});
  featCollection.push({name:"Kilowog Falls!",                       category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Villain",description:"Defeat Kilowog near Metropolis's Historic District"});
  featCollection.push({name:"The Flash Falls!",                     category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Villain",description:"Defeat The Flash in Metropolis's Midtown District"});
  featCollection.push({name:"Green Arrow and Black Canary Fall!",   category:"Solo",subcategory:"Iconic Battles",stars:1,points:10,faction:"Villain",description:"Defeat Green Arrow and Black Canary near Gotham Mercy General Hospital"});

  featCollection.push({name:"Oh, I Get It",             category:"Solo",subcategory:"Contacts",stars:2,points:25,faction:"Both",description:"Complete all of the Punchline story arc side missions"});
  featCollection.push({name:"Phoenix Initiate",         category:"Solo",subcategory:"Contacts",stars:2,points:25,faction:"Both",description:"Complete all of the 'Til Death do Us Part story arc side missions"});
  featCollection.push({name:"The End of the Beginning", category:"Solo",subcategory:"Contacts",stars:2,points:25,faction:"Both",description:"Complete all of The Beginning of the End story arc side missions"});
  featCollection.push({name:"In the Mist",              category:"Solo",subcategory:"Contacts",stars:2,points:25,faction:"Both",description:"Complete all of Survival of the Fittest story arc side missions"});
  featCollection.push({name:"A Family Affair",          category:"Solo",subcategory:"Contacts",stars:2,points:25,faction:"Both",description:"Complete all of Sins of the Father story arc side missions"});
  featCollection.push({name:"Meta-ticulous",            category:"Solo",subcategory:"Contacts",stars:2,points:25,faction:"Both",description:"Complete all of Legacy of Krypton story arc side missions"});
  featCollection.push({name:"Beauties and the Beasts",  category:"Solo",subcategory:"Contacts",stars:2,points:25,faction:"Both",description:"Complete all of Hearts of Darkness story arc side missions"});
  featCollection.push({name:"Committed",                category:"Solo",subcategory:"Contacts",stars:2,points:25,faction:"Both",description:"Complete all of Arkham Unleashed story arc side missions"});
  featCollection.push({name:"Walked the Beat",          category:"Solo",subcategory:"Contacts",stars:2,points:25,faction:"Both",description:"Complete all of Gang War story arc side missions"});
  featCollection.push({name:"Power Ring Master",        category:"Solo",subcategory:"Contacts",stars:2,points:25,faction:"Both",description:"Complete all of the Dying of the Light story arc side missions"});

  featCollection.push({name:"An Eye for Survival",            category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete the OMAC Base without being KO'd"});
  featCollection.push({name:"The Unyielding",                 category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete The Oblivion Bar without being KO'd"});
  featCollection.push({name:"The Power to Survive",           category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete Gotham STAR Labs without being KO'd"});
  featCollection.push({name:"Touch of the Immortals",         category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete Gotham University Without being KO'd"});
  featCollection.push({name:"Making a Splash",                category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete the condemned shipyeards without being KO'D"});
  featCollection.push({name:"The Will to Live",               category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete the Metropolis City Hall without being KO'd"});
  featCollection.push({name:"Resistant to Her Charm",         category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete the Greenhouse without being KO'd"});
  featCollection.push({name:"We Will Not Falter",             category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete the Chinatown Cafe without being KO'd"});
  featCollection.push({name:"STAR Power",                     category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete the Star Labs without being KO'd"});
  featCollection.push({name:"Unflappable",                    category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete the Regal Hotel without being KO'd"});
  featCollection.push({name:"Ain't Going Down",               category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete the Gotham Sewers without being KO'd"});
  featCollection.push({name:"Surviving Patient",              category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete Metro General Hospital without being KO'd"});
  featCollection.push({name:"Good Deal",                      category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete Mannheim's Chinese Theatre without being KO'd"});
  featCollection.push({name:"Fun Times",                      category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete the Amusement Mile without being KO'd"});
  featCollection.push({name:"It's Not Judgement Time Yet",    category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete the Lair of the Spectre without being KO'd"});
  featCollection.push({name:"Staying Power",                  category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete the Hall of Doom without being KO'd"});
  featCollection.push({name:"Evading Death... Stroke",        category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete the Monarchs Playing Card Factory without being KO'd"});
  featCollection.push({name:"Heros with the Might of Magic",  category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete Eslworth Hospital without being KO'd"});
  featCollection.push({name:"Arcane Luck",                    category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete the MPD 8th Precinct without being KO'd"});
  featCollection.push({name:"A Wonderful Performance",        category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete the Metro Station Building without being KO'd"});
  featCollection.push({name:"Unstung Heroes",                 category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete the HIVE Base without being KO'd"});
  featCollection.push({name:"Viva los Heroes",                category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete Cape Camine Lighthouse without being KO'd"});
  featCollection.push({name:"No Monkeying Around",            category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete Grodd's Lair in Metropolis without being KO'd"});
  featCollection.push({name:"Too Cool for School",            category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Villain",description:"Complete Metropolis University solo instance without being KO'd"});
  featCollection.push({name:"The Cat's Meow",                 category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Villain",description:"Complete Burnley Freight Warehouse solo instance without being KO'd"});
  featCollection.push({name:"That Which Cannot Be Killed",    category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete the Hidden Sentinels of Magic Base solo instance without being KO'd"});
  featCollection.push({name:"Might Is Right",                 category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete the STAR Labs solo instance without being KO'd"});
  featCollection.push({name:"No Joking Matter",               category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete the Regal Hotel solo instance without being KO'd"});
  featCollection.push({name:"The Power of the Queen",         category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete the Chinatown Cafe solo instance without being KO'd"});
  featCollection.push({name:"Tough Like Gorilla",             category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete the Old STAR Labs solo instance without being KO'd"});
  featCollection.push({name:"Cool as Ice",                    category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete the Gotham Mercy General Hospital solo instance without being KO'd"});
  featCollection.push({name:"Fear Not Death",                 category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete the Metropolis City Hall solo instance without being KO'd"});
  featCollection.push({name:"Blood Immortal",                 category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete the Forum of the Twelve solo instance without being KO'd"});
  featCollection.push({name:"The Devil's Luck",               category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete the Gotham University solo instance without being KO'd"});
  featCollection.push({name:"Sinister Approach",              category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete the JSA Metropolis Wing solo instance without being KO'd"});
  featCollection.push({name:"Keeping an Eye Out",             category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete the OMAC Base solo instance without being KO'd"});
  featCollection.push({name:"Wearing Your Survival Suit",     category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete the Watchtower solo instance without being KO'd"});
  featCollection.push({name:"The Good Die Young",             category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete Gotham STAR Labs solo instance without being KO'd"});
  featCollection.push({name:"The Undying",                    category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete the Oblivion Bar solo instance without being KO'd"});
  featCollection.push({name:"Eight Lives Left Over",          category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete the Gotham University Warehouse solo instance without being KO'd"});
  featCollection.push({name:"You Listen To Me More, You Live Longer!", category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete the Religion of Crime's ritual in the Temple of Crime solo instance without being KO'd"});
  featCollection.push({name:"Avoided The Third Rail",         category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete the invasion of the Penguin's underground smuggling operation in the Gotham Old Subway without being KO'd"});
  featCollection.push({name:"The Power to Live",              category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete the MPD 8th Precinct solo instance without being KO'd"});
  featCollection.push({name:"A Gigantic Accomplishment",      category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete the Metro Station Building solo instance without being KO'd"});
  featCollection.push({name:"Doctor's Orders",                category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete the Metro General Hospital solo instance without being KO'd"});
  featCollection.push({name:"By Her Will",                    category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete the Sentinels of Magic Base solo instance without being KO'd"});
  featCollection.push({name:"Undefeated",                     category:"Solo",subcategory:"Survival",stars:1,points:10,faction:"Both",description:"Complete the Cape Carmine Lighthouse solo instance without being KO'd"});

  featCollection.push({name:"Pop Quiz, Hotshot!",              category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Both",description:"Diffuse the bombs before the police officers die in Regal Hotel"});
  featCollection.push({name:"Detox",                           category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Hero",description:"Destroy all Venom cannisters in Burnley Warehouse"});
  featCollection.push({name:"On Your Feet!",                   category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Both",description:"Revive all the defeated Amazons in Circe's Hidden Base"});
  featCollection.push({name:"Green Machine",                   category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Both",description:"Incinerate dangerous bio-hazardous materials strewn around Metro General Hospital"});
  featCollection.push({name:"Fire Sale",                       category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Both",description:"Extinguish all of the magical flames in the Chinatown magic shop"});
  featCollection.push({name:"Counselor",                       category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Both",description:"Break Circe's control over the bewitched Amazons in Circe's Citadel"});
  featCollection.push({name:"Gate Crasher",                    category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Villain",description:"Open the gate to Scarecrow's inner lair within 3 minutes of entering the sewers"});
  featCollection.push({name:"Brute Force",                     category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Both",description:"Complete the adventure in STAR's secret lab without activating any turrets"});
  featCollection.push({name:"Leader Of The Pride",             category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Both",description:"Save all Lion Cubs in the Gotham University Warehouse"});
  featCollection.push({name:"Quick Crags",                     category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Both",description:"Secure 14 crags in the Shadowlands in 100 seconds or less"});
  featCollection.push({name:"Single Minded",                   category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Both",description:"Defeat the Overlord in the Hall of Doom without defeating his robots"});
  featCollection.push({name:"Pain in the Brainiac",            category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Both",description:"Defeat 50 of Brainiac's robots on the STAR Lab satellite"});
  featCollection.push({name:"Fumigator",                       category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Both",description:"Secure the 4 pressure valves in 80 secoonds or under in the Gotham University Warehouse"});
  featCollection.push({name:"Eye Blinked",                     category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Both",description:"Defeat Brother Eye underneath Gotham's Knightsdome Sporting Complex without knocking out his guardian drones"});
  featCollection.push({name:"Re-Evolver",                      category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Both",description:"Free all the civilians in Gorilla Grodd's hideout from the devolution process"});
  featCollection.push({name:"The Androids You're Looking For", category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Both",description:"Defeat 30 of T.O.Morrow's Androids in T.O.Morrow's Lab"});
  featCollection.push({name:"Brain Intact",                    category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Both",description:"Make it through the waves of zombies in the Tomb of Isis"});
  featCollection.push({name:"Shadow-Packed",                   category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Both",description:"Defeat 30 Ghosts in the Glenmorgan Square Office Building"});
  featCollection.push({name:"Emancipator",                     category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Both",description:"Rescue all of the enslaved citizens from the Condemned Shipyards"});
  featCollection.push({name:"Spy Smasher",                     category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Both",description:"Arrest all of the LexCorp SpecOps who infiltrated the HIVE Metrodome"});
  featCollection.push({name:"Soul Saver",                      category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Both",description:"Smash all the soul globes in Mannheim's Chinese Theatre"});
  featCollection.push({name:"Out of Service",                  category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Both",description:"Stop the disabled J1N1 from reactivating inside the Monarch Playing Card Company"});
  featCollection.push({name:"Staunching the Flow",             category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Both",description:"Destroy 15 blood vats located throughout Ellsworth Memorial Hospital"});
  featCollection.push({name:"Lead from the Front",             category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Both",description:"Defeat the Manhunter in City Hall while all allies are still in the fight"});
  featCollection.push({name:"Peas Officer",                    category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Both",description:"Free all of the GPCD officer's from Poison Ivy's pods underneath the Botanical Gardens"});
  featCollection.push({name:"No More Funny Business",          category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Both",description:"Defeat 30 Joker Clowns in the Amusement Mile Funhouse"});
  featCollection.push({name:"Blue Christmas",                  category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Hero",description:"Free 12 of the SCU troops trapped in SCU Police Station"});
  featCollection.push({name:"Sin No More",                     category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Both",description:"Defeat all of Trigon's sin demons in the Science Police Headquarters"});
  featCollection.push({name:"Beast Basher",                    category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Both",description:"Defeat 60 of the Beastiamorphs in the Metro Station"});
  featCollection.push({name:"Taking Out The Laundering",       category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Both",description:"Collect all of Intergang's Counterfeit Money in their Warehouse"});
  featCollection.push({name:"Lights Out in the Lighthouse",    category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Both",description:"Defeat all enemies and destroy all Venom canisters in the Lighthouse up to Bane"});
  featCollection.push({name:"Extreme Birdwatching",            category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Both",description:"Investigate all of the Bird Statues in the Gotham Old Subway"});
  featCollection.push({name:"Mister J's Special BBQ Recipe",   category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Villain",description:"Set 30 police officers on fire in Amusement Mile Funhouse"});
  featCollection.push({name:"Smashing Science",                category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Villain",description:"Defeat 30 Science Police Officers in Science Police HQ"});
  featCollection.push({name:"Go for the Throat!",              category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Villain",description:"Defeat Shevla'nuhur Kyramud in the Watchtower without defeating his robots"});
  featCollection.push({name:"Man Down!",                       category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Villain",description:"Reach the final confrontation in STAR's secret lab without losing any men"});
  featCollection.push({name:"Evidence? What Evidence?",        category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Villain",description:"Burn evidence of LexCorp's activities at Metro General"});
  featCollection.push({name:"Blitz",                           category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Villain",description:"Defeat the Alpha Lantern in City Hall while all allies are still in the fight"});
  featCollection.push({name:"Stuffed",                         category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Villain",description:"Let Cold Cut eat from the vending machine 8 times before defeating him inside Mister Freeze's lair"});
  featCollection.push({name:"Now You See Me...",               category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Villain",description:"Disable all security cameras and consoles inside Metro University"});
  featCollection.push({name:"Favor for the Family",            category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Villain",description:"Free 13 Falcone mobsters in the Burnley Freight Yards"});
  featCollection.push({name:"Bestiamorph Ethics",              category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Villain",description:"Free all of the captured Bestiamorphs in Circe's Citadel"});
  featCollection.push({name:"No Respect!",                     category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Villain",description:"Desecrate the Amazonian's Enchanted Colossus in Circe's Hidden Base"});
  featCollection.push({name:"Information Warfare",             category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Villain",description:"Burn all the bookcases in the Sentinels of Magic Citadel"});
  featCollection.push({name:"Watch Your Step",                 category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Villain",description:"Redirect all the portals in the Sentinels of Magic base to Hades"});
  featCollection.push({name:"Two Birds with One Stone",        category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Villain",description:"Defeat Hawkman and Hawkgirl within 10 seconds of each other in the JSA Metropolis HQ"});
  featCollection.push({name:"Are We Not Men?",                 category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Villain",description:"Complete the Old STAR Labs without devolving into a super gorilla"});
  featCollection.push({name:"Yoink!",                          category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Villain",description:"Steal all the Venom canisters in the Burnley Warehouse"});
  featCollection.push({name:"Ringmaster",                      category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Villain",description:"Fight through the Regal Hotel without losing a single clown"});
  featCollection.push({name:"Look Ma, No Hands",               category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Villain",description:"Free Eclipso in the Sentinel Hold without securing the Hands of Shadow"});
  featCollection.push({name:"Pig in a Blanket",                category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Villain",description:"Gift wrap 50 defeated SCU troops in the SCU Police Station"});
  featCollection.push({name:"Bacon in a Box",                  category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Villain",description:"Gift wrap 25 defeated SCU troops in the SCU Police Station"});
  featCollection.push({name:"Soul Reaper",                     category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Villain",description:"Collect every soul in Brother Blood's inner sanctum and defeat Raven"});
  featCollection.push({name:"Titanic",                         category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Villain",description:"Convert all five Titans in Brother Blood's inner Sanctum (may require multiple playthroughs)"});
  featCollection.push({name:"Veterinarian",                    category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Villain",description:"Resurrect the fallen Bestiamorphs in the Metro Station"});
  featCollection.push({name:"The Croc Hunter",                 category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Both",description:"Complete the Scarecrow boss fight in the Gotham Sewer without allowing any Killer Croc Hallucinations to rise"});
  featCollection.push({name:"Can't Get Enough Of That Justice",category:"Solo",subcategory:"Hideouts",stars:1,points:10,faction:"Both",description:"Encounter and Defeat both Bane and Hush in the Gotham Old Subway"});

  featCollection.push({name:"Pot of Gold",                          category:"Seasonal",subcategory:"St. Patrick's Day",stars:2,points:25,faction:"Both",description:"Complete all of the St. Patrick's Day seasonal feats"});
  featCollection.push({name:"Drink Up!",                            category:"Seasonal",subcategory:"St. Patrick's Day",stars:1,points:10,faction:"Both",description:"Drink all varieties of Mister Mxyzptlk Brew"});
  featCollection.push({name:"Take One Down, Pass it Around",        category:"Seasonal",subcategory:"St. Patrick's Day",stars:1,points:10,faction:"Both",description:"Drink any 10 Mister Mxyzptlk Brews"});
  featCollection.push({name:"Over the Rainbow",                     category:"Seasonal",subcategory:"St. Patrick's Day",stars:1,points:10,faction:"Both",description:"Complete the Daily Planet Race Challenge"});
  featCollection.push({name:"Where's ME gold? ",                    category:"Seasonal",subcategory:"St. Patrick's Day",stars:1,points:10,faction:"Both",description:"Sight Mister Mxyzptlk in Metropolis or Gotham 5 times"});
  featCollection.push({name:"Kltpzyxm",                             category:"Seasonal",subcategory:"St. Patrick's Day",stars:1,points:10,faction:"Both",description:"Complete the Mister Mxyzptlk daily 10 times"});
  featCollection.push({name:"Fancy Lad",                            category:"Seasonal",subcategory:"St. Patrick's Day",stars:1,points:10,faction:"Both",description:"Collect all styles in the Celtic set"});

  featCollection.push({name:"A Hallmark of Success",                category:"Seasonal",subcategory:"Valentine's Day",stars:2,points:25,faction:"Both",description:"Complete all of the Valentine's Day seasonal feats"});
  featCollection.push({name:"The Power Goes Straigth to My Thighs", category:"Seasonal",subcategory:"Valentine's Day",stars:1,points:10,faction:"Both",description:"Eat any 10 holiday candies"});
  featCollection.push({name:"I Choo-Choo-Choose You!",              category:"Seasonal",subcategory:"Valentine's Day",stars:1,points:10,faction:"Both",description:"Consume all of the Valentine's Day hearts"});
  featCollection.push({name:"Pretty in Pink",                       category:"Seasonal",subcategory:"Valentine's Day",stars:1,points:10,faction:"Both",description:"Collect all the styles in the Valentine set"});
  featCollection.push({name:"Don't Lose Heart!",                    category:"Seasonal",subcategory:"Valentine's Day",stars:1,points:10,faction:"Both",description:"Help influence Aphrodite towards Scorn or Devotion without allowing the opposition to convert any hearts"});
  featCollection.push({name:"Cute Overload",                        category:"Seasonal",subcategory:"Valentine's Day",stars:1,points:10,faction:"Both",description:"Obtain the Heart of Devotion trinket"});
  featCollection.push({name:"What's Love Got to do With it",        category:"Seasonal",subcategory:"Valentine's Day",stars:1,points:10,faction:"Both",description:"Obtain the Heart of Scorn trinket"});
  featCollection.push({name:"Love is Hard Work",                    category:"Seasonal",subcategory:"Valentine's Day",stars:1,points:10,faction:"Both",description:"Complete all of the missions in Aphrodite's Realm"});
  featCollection.push({name:"Life is Like...",                      category:"Seasonal",subcategory:"Valentine's Day",stars:1,points:10,faction:"Both",description:"Help both Devotion and Scorn prevail in Aphrodite's Temple"});
  featCollection.push({name:"It's a Love/Hate Relationship",        category:"Seasonal",subcategory:"Valentine's Day",stars:1,points:10,faction:"Both",description:"Eat all three varieties of holiday candy"});

  featCollection.push({name:"Winter Is Coming",                     category:"Seasonal",subcategory:"Winter Holidays",stars:2,points:25,faction:"Both",description:"Complete all of the Winter seasonal feats"});
  featCollection.push({name:"Twelve Days of Larfleeze",             category:"Seasonal",subcategory:"Winter Holidays",stars:1,points:10,faction:"Both",description:"Spot Larfleeze on Twelve Seperate Days of Winter"});
  featCollection.push({name:"Checking It Twice",                    category:"Seasonal",subcategory:"Winter Holidays",stars:1,points:10,faction:"Both",description:"Collect both Winter seasonal collections"});
  featCollection.push({name:"Snowball Fight!",                      category:"Seasonal",subcategory:"Winter Holidays",stars:1,points:10,faction:"Both",description:"Throw 50 snowballs"});
  featCollection.push({name:"15 Crazy Nights",                      category:"Seasonal",subcategory:"Winter Holidays",stars:1,points:10,faction:"Both",description:"Complete the Winter seasonal daily quest 15 times"});
  featCollection.push({name:"Santa's Little Helper",                category:"Seasonal",subcategory:"Winter Holidays",stars:1,points:10,faction:"Both",description:"Collect all styles in the Holiday Elf set"});

  featCollection.push({name:"The Renewal of Spring",                category:"Seasonal",subcategory:"Springtime",stars:2,points:25,faction:"Both",description:"Complete all of the Spring seasonal feats"});
  featCollection.push({name:"Fruit Flavored",                       category:"Seasonal",subcategory:"Springtime",stars:1,points:10,faction:"Both",description:"Eat all varieties of Boost! Snacks"});
  featCollection.push({name:"That's No Ordinary Rabbit",            category:"Seasonal",subcategory:"Springtime",stars:1,points:10,faction:"Both",description:"Collect all styles in the Warrior of Spring set"});
  featCollection.push({name:"Eco Friendly",                         category:"Seasonal",subcategory:"Springtime",stars:1,points:10,faction:"Both",description:"Complete the Spring Seasonal daily quest ten times"});
  featCollection.push({name:"Seeds of Success",                     category:"Seasonal",subcategory:"Springtime",stars:1,points:10,faction:"Both",description:"Purchase any of the Spring Seasonal Trinkets"});

  featCollection.push({name:"Eat, Drink and be Scary",              category:"Seasonal",subcategory:"Spooktacular",stars:2,points:25,faction:"Both",description:"Complete all of the Spooktacular feats"});
  featCollection.push({name:"Trick Or Treat, Smell My Feat",        category:"Seasonal",subcategory:"Spooktacular",stars:1,points:10,faction:"Both",description:"Consume all of the different Spooktacular Tricks and Treats"});
  featCollection.push({name:"I Must Not Fear",                      category:"Seasonal",subcategory:"Spooktacular",stars:1,points:10,faction:"Both",description:"Complete the Scarecrow Spooktacular Event 5 times"});
  featCollection.push({name:"Costume Party",                        category:"Seasonal",subcategory:"Spooktacular",stars:1,points:10,faction:"Both",description:"Collect all styles from Skeets' Boo-tique"});
  featCollection.push({name:"Candy Candy Candy Candy",              category:"Seasonal",subcategory:"Spooktacular",stars:1,points:10,faction:"Both",description:"Consume 25 Spooktacular Tricks or Treats"});

  featCollection.push({name:"Making Waves",							category:"Seasonal",subcategory:"Tides of War",stars:2,points:25,faction:"Both",description:"Complete the feats Maritimed, Full Net, Under The Sea, Sea Dog and Seafarer"});
  featCollection.push({name:"Maritimed",							category:"Seasonal",subcategory:"Tides of War",stars:1,points:10,faction:"Both",description:"Complete the Atlantean Outpost seasonal event in 4 minutes or less."});
  featCollection.push({name:"Full Net",								category:"Seasonal",subcategory:"Tides of War",stars:2,points:10,faction:"Both",description:"Defeat all Mutineers in the Atlantean Outpost before defeating Ocean Master/Aquaman."});
  featCollection.push({name:"Under The Sea",                        category:"Seasonal",subcategory:"Tides of War",stars:1,points:10,faction:"Both",description:"Complete the Atlantean Outpost instance 10 times."});
  featCollection.push({name:"Sea Dog",								category:"Seasonal",subcategory:"Tides of War",stars:1,points:10,faction:"Both",description:"Knock out 250 Mutineers in the strait north of Little Bohemia."});
  featCollection.push({name:"Seafarer",								category:"Seasonal",subcategory:"Tides of War",stars:2,points:10,faction:"Both",description:"Complete both Tides of War seasonal collections."});
  featCollection.push({name:"Current Fashion",						category:"Seasonal",subcategory:"Tides of War",stars:2,points:10,faction:"Both",description:"Collect all styles in the Atlantean Warsuit set."});

  featCollection.push({name:"Fight for the Light",                          category:"DLC",subcategory:"Fight for the Light",stars:2,points:25,faction:"Both",description:"Complete Ferris Aircraft Duo, STAR Labs Alert, Coast City Alert, and Oan Sciencecells Alert"});
  featCollection.push({name:"Willpower Outage",                             category:"DLC",subcategory:"Fight for the Light",stars:2,points:25,faction:"Both",description:"Defeat the Scion of WIll before the Sliceclaws power it up"});
  featCollection.push({name:"Fast and Fearless",                            category:"DLC",subcategory:"Fight for the Light",stars:2,points:25,faction:"Both",description:"Defeat the Scion of Fear in less than 5 minutes"});
  featCollection.push({name:"Temper Tantrums",                              category:"DLC",subcategory:"Fight for the Light",stars:2,points:25,faction:"Both",description:"Confiscate 6 Red Power Rings from Civilians at Ferris Aircraft in Coast CIty"});
  featCollection.push({name:"Conviction",                                   category:"DLC",subcategory:"Fight for the Light",stars:2,points:25,faction:"Both",description:"Complete Oan Sciencecells without being knocked out"});
  featCollection.push({name:"Faster Than Light Waves",                      category:"DLC",subcategory:"Fight for the Light",stars:2,points:25,faction:"Both",description:"Complete Oan Sciencecells in 20 minutes or less"});
  featCollection.push({name:"Twice the Speed of Light",                     category:"DLC",subcategory:"Fight for the Light",stars:1,points:10,faction:"Both",description:"Finish the Coast City Duo in 7 minutes or less"});
  featCollection.push({name:"Parole Denied",                                category:"DLC",subcategory:"Fight for the Light",stars:2,points:25,faction:"Hero",description:"Defeat as a Hero Red Lantern Vice, Yellow Lantern Lyssa Drak and Evil Star in the Oan Sciencecells"});
  featCollection.push({name:"Parole Granted",                               category:"DLC",subcategory:"Fight for the Light",stars:2,points:25,faction:"Villain",description:"Defeat as a Villain Red Lantern Vice, Yellow Lantern Lyssa Drak and Evil Star in the Oan Sciencecells"});
  featCollection.push({name:"Not that Repulsive",                           category:"DLC",subcategory:"Fight for the Light",stars:1,points:10,faction:"Both",description:"Defeat Vice in the Coast City Duo without restarting the repulsor"});
  featCollection.push({name:"Low Battery",                                  category:"DLC",subcategory:"Fight for the Light",stars:3,points:50,faction:"Hero",description:"Beat the Final Confrontation as a hero without using any Logic Batteries within the Hangar at Ferris Aircraft in Coast City"});
  featCollection.push({name:"Illogical Reasoning",                          category:"DLC",subcategory:"Fight for the Light",stars:3,points:50,faction:"Villain",description:"Beat the Final Confrontation as a villain without using any Logic Batteries within the Hangar at Ferris Aircraft in Coast City"});
  featCollection.push({name:"Intensive Group Therapy",                      category:"DLC",subcategory:"Fight for the Light",stars:2,points:25,faction:"Both",description:"Defeat the Coast City Alert in less than 30 minutes"});
  featCollection.push({name:"Speed of Light",                               category:"DLC",subcategory:"Fight for the Light",stars:2,points:25,faction:"Both",description:"Complete the STAR Labs Alert in less than 30 minutes"});
  featCollection.push({name:"Prime Timeline",                               category:"DLC",subcategory:"Lightning Strikes",stars:1,points:10,faction:"Both",description:"Complete the Massive Speed Force Rupture Event"});
  featCollection.push({name:"Play On",                                      category:"DLC",subcategory:"Lightning Strikes",stars:2,points:25,faction:"Both",description:"Complete the Cosmic Treadmill: Flashback Duo without destroying any Sonic Emitters"});
  featCollection.push({name:"Two Tickets to Paradox",                       category:"DLC",subcategory:"Lightning Strikes",stars:1,points:10,faction:"Both",description:"Seal both types of Massive Speed Force Ruptures"});
  featCollection.push({name:"Rogues' Gallery",                              category:"DLC",subcategory:"Lightning Strikes",stars:2,points:25,faction:"Hero",description:"Complete all of the Rogues' Wanted Posters"});
  featCollection.push({name:"Crash of the Titans",                          category:"DLC",subcategory:"Lightning Strikes",stars:2,points:25,faction:"Villain",description:"Complete all of the Titans' Bounties"});
  featCollection.push({name:"For My Next Trick!",                           category:"DLC",subcategory:"Lightning Strikes",stars:1,points:10,faction:"Both",description:"Defeat Abra Kadabra while all the Riot-Bots are active without being knocked out"});
  featCollection.push({name:"He's Heating Up!",                             category:"DLC",subcategory:"Lightning Strikes",stars:1,points:10,faction:"Both",description:"Complete a Lightning Strikes Bounty or Wanted mission without being knocked out"});
  featCollection.push({name:"He's On Fire!",                                category:"DLC",subcategory:"Lightning Strikes",stars:1,points:10,faction:"Both",description:"Complete 5 Lightning Strikes Bounty or Wanted missions without being knocked out"});
  featCollection.push({name:"M-M-M-M-Monster Kill!",                        category:"DLC",subcategory:"Lightning Strikes",stars:2,points:25,faction:"Both",description:"Complete 10 Lightning Strikes Bounty or Wanted missions without being knocked out"});
  featCollection.push({name:"Taking Out The Trash",                         category:"DLC",subcategory:"Lightning Strikes",stars:1,points:10,faction:"Both",description:"Complete 50 Lightning Strikes Bounty or Wanted missions"});
  featCollection.push({name:"Central City's Most Wanted",                   category:"DLC",subcategory:"Lightning Strikes",stars:1,points:10,faction:"Both",description:"Complete 100 Lightning Strikes Bounty or Wanted missions"});
  featCollection.push({name:"Bountiful",                                    category:"DLC",subcategory:"Lightning Strikes",stars:1,points:10,faction:"Both",description:"Complete 250 Lightning Strikes Bounty or Wanted missions"});
  featCollection.push({name:"How Do These Guys Keep Getting Loose?",        category:"DLC",subcategory:"Lightning Strikes",stars:2,points:25,faction:"Both",description:"Complete 500 Lightning Strikes Bounty or Wanted missions"});
  featCollection.push({name:"Changed In A Flash",                           category:"DLC",subcategory:"Lightning Strikes",stars:1,points:10,faction:"Both",description:"Activate any compartment trinket"});
  featCollection.push({name:"Reap the Rewards",                             category:"DLC",subcategory:"Lightning Strikes",stars:1,points:10,faction:"Both",description:"Defeat 100 Paradox Reapers in Central City"});
  featCollection.push({name:"If A Paradox Reaper Falls In Central City...", category:"DLC",subcategory:"Lightning Strikes",stars:1,points:10,faction:"Both",description:"Defeat 500 Paradox Reapers in Central City"});
  featCollection.push({name:"Jeepers, It's The Reapers",                    category:"DLC",subcategory:"Lightning Strikes",stars:1,points:10,faction:"Both",description:"Defeat 1000 Paradox Reapers in Central City"});
  featCollection.push({name:"Catch-2200",                                   category:"DLC",subcategory:"Lightning Strikes",stars:1,points:10,faction:"Both",description:"Defeat 2200 Paradox Reapers in Central City"});
  featCollection.push({name:"Is This The End, Or Was It The Beginning?",    category:"DLC",subcategory:"Lightning Strikes",stars:1,points:10,faction:"Both",description:"Defeat 5000 Paradox Reapers in Central City"});
  featCollection.push({name:"Quickly, Into the Past",                       category:"DLC",subcategory:"Lightning Strikes",stars:1,points:10,faction:"Both",description:"Complete the Cosmic Treadmill: Flashback Duo in under 7 minutes"});
  featCollection.push({name:"99 Bottles",                                   category:"DLC",subcategory:"Battle for Earth",stars:1,points:10,faction:"Both",description:"Complete 99 Battle for Earth Duos"});
  featCollection.push({name:"Bottle Opener",                                category:"DLC",subcategory:"Battle for Earth",stars:2,points:25,faction:"Both",description:"Complete 250 Battle for Earth Duos"});
  featCollection.push({name:"Prime Numbers",                                category:"DLC",subcategory:"Battle for Earth",stars:2,points:25,faction:"Both",description:"Defeat all three Prime Avatars without destroying any of Brainiac Spawners"});
  featCollection.push({name:"Fodder Sweeper",                               category:"DLC",subcategory:"Battle for Earth",stars:1,points:10,faction:"Both",description:"Destroy the three Brainiac Spawners near the Core in the Prime Battleground raid"});
  featCollection.push({name:"Olympian",                                     category:"DLC",subcategory:"Battle for Earth",stars:2,points:25,faction:"Both",description:"Complete the Themyscira: The Gates of Tartarus raid in 30 minutes or less"});
  featCollection.push({name:"They Used to be Adventurers",                  category:"DLC",subcategory:"Battle for Earth",stars:1,points:10,faction:"Both",description:"Ensure all three Colossal Archers reach the front lines at the Paradise Court battle in the Themyscira: The Gates of Tartarus raid"});
  featCollection.push({name:"Honor the Fallen",                             category:"DLC",subcategory:"Battle for Earth",stars:1,points:10,faction:"Both",description:"Honor the fallen Amazons in Themyscira"});
  featCollection.push({name:"Riverfront Shortsale",                         category:"DLC",subcategory:"Battle for Earth",stars:1,points:10,faction:"Both",description:"Complete the Riverfront Center duo in 10 minutes or less"});
  featCollection.push({name:"No Waiting Room",                              category:"DLC",subcategory:"Battle for Earth",stars:1,points:10,faction:"Both",description:"Complete the Gotham Hospital duo in 10 minutes or less"});
  featCollection.push({name:"Brief Stay",                                   category:"DLC",subcategory:"Battle for Earth",stars:1,points:10,faction:"Both",description:"Complete the Riverside Hotel duo in 10 minutes or less"});
  featCollection.push({name:"Luthor's Union!",                              category:"DLC",subcategory:"Battle for Earth",stars:1,points:10,faction:"Both",description:"Convert 250 Civilians inside of the Battle for Earth duos"});
  featCollection.push({name:"Pod Breaker",                                  category:"DLC",subcategory:"Battle for Earth",stars:1,points:10,faction:"Both",description:"Destroy 250 Cybernetic Viral Pods inside of the Battle for Earth duos"});
  featCollection.push({name:"Bomb Squad",                                   category:"DLC",subcategory:"Battle for Earth",stars:1,points:10,faction:"Both",description:"Detonate 250 Bombs inside of the Battle for Earth duos"});
  featCollection.push({name:"Conversion Therapy",                           category:"DLC",subcategory:"Battle for Earth",stars:1,points:10,faction:"Both",description:"Complete all Battle for Earth duos"});
  featCollection.push({name:"Jury Tampering",                               category:"DLC",subcategory:"Battle for Earth",stars:2,points:25,faction:"Both",description:"Stack the jury with 12 humans, not allowing any Brainiac Jurors to be transported"});
  featCollection.push({name:"Timely Closing Arguments",                     category:"DLC",subcategory:"Battle for Earth",stars:1,points:10,faction:"Both",description:"Defeat the Prosecutor and Defense Attorney within 10 seconds of each other in the South Gotham Courthouse Alert"});
  featCollection.push({name:"Can't Hide!",                                  category:"DLC",subcategory:"Battle for Earth",stars:1,points:10,faction:"Both",description:"Locate and defeat all three types of Stealth Units in the South Gotham Courthouse Alert"});
  featCollection.push({name:"Guilty On All Charges",                        category:"DLC",subcategory:"Battle for Earth",stars:2,points:25,faction:"Both",description:"Allow all Sentences to run their full course when fighting the Supreme Justice in the South Gotham Courthouse Alert"});
  featCollection.push({name:"Zone Sweeper Sweeper",                         category:"DLC",subcategory:"Battle for Earth",stars:1,points:10,faction:"Both",description:"Complete the Deconstruction daily quest in South Gotham"});
  featCollection.push({name:"In Prime Time",                                category:"DLC",subcategory:"Battle for Earth",stars:2,points:25,faction:"Both",description:"Finish the Prime Battleground Raid in 15 minutes or less"});
  featCollection.push({name:"Uncover the Truth",                            category:"DLC",subcategory:"Battle for Earth",stars:2,points:25,faction:"Both",description:"Complete all of the Collections, Briefings, and Investigations available in the Battle for Earth DLC"});
  featCollection.push({name:"No Tag Out!",                                  category:"DLC",subcategory:"Battle for Earth",stars:2,points:25,faction:"Both",description:"Defeat each Prime Avatar before any of them get the chance to 'transition out' in the Prime Battleground raid"});
  featCollection.push({name:"Bottle Hardened",                              category:"DLC",subcategory:"Battle for Earth",stars:1,points:10,faction:"Both",description:"Complete 25 Battle for Earth Duos"});
  featCollection.push({name:"Come With Me If You Want To Live",             category:"DLC",subcategory:"Battle for Earth",stars:1,points:10,faction:"Both",description:"Save 250 Civilians Inside of the Battle for Earth duos"});

  featCollection.push({name:"Doom Control",                                 category:"DLC",subcategory:"The Last Laugh",stars:1,points:10,faction:"Both",description:"Win 20 Assault: Headquarters arena matches in the Hall of Doom"});
  featCollection.push({name:"Menace to Society",                            category:"DLC",subcategory:"The Last Laugh",stars:1,points:10,faction:"Both",description:"Win an Assault: Headquarters arena match in The Hall of Doom"});
  featCollection.push({name:"Your Map to the Stars",                        category:"DLC",subcategory:"The Last Laugh",stars:1,points:10,faction:"Both",description:"Encounter all Iconic characters in the Assault: Headquarters PVP arena"});
  featCollection.push({name:"That's Heavy",                                 category:"DLC",subcategory:"The Last Laugh",stars:1,points:10,faction:"Both",description:"Win 25 Graviton Recovery matches in the Police Station City Safehouse arena"});
  featCollection.push({name:"Spacial Delivery",                             category:"DLC",subcategory:"The Last Laugh",stars:1,points:10,faction:"Both",description:"Transport the Graviton Singularity Capsule successfully 50 times in the Assault: City Safehouses PVP Arena"});
  featCollection.push({name:"Heavy Beats",                                  category:"DLC",subcategory:"The Last Laugh",stars:1,points:10,faction:"Both",description:"Win 25 Graviton Recovery matches in the Nightclub City Safehouse Arena"});
  featCollection.push({name:"You're Grounded!",                             category:"DLC",subcategory:"The Last Laugh",stars:1,points:10,faction:"Both",description:"Win a Graviton Recovery match in the Nightclub City Safehouse Arena"});
  featCollection.push({name:"Hostage Negotiator",                           category:"DLC",subcategory:"The Last Laugh",stars:1,points:10,faction:"Both",description:"Free 50 non-combatant allies in the City Safehouses Arenas"});
  featCollection.push({name:"Rescue Ranger",                                category:"DLC",subcategory:"The Last Laugh",stars:1,points:10,faction:"Both",description:"Win a Rescue match in the Police Station City Safehouse Arena"});
  featCollection.push({name:"Rescue 911",                                   category:"DLC",subcategory:"The Last Laugh",stars:1,points:10,faction:"Both",description:"Win 25 Rescue matches in the Police Station City Safehouse Arena"});
  featCollection.push({name:"No Wallflower",                                category:"DLC",subcategory:"The Last Laugh",stars:1,points:10,faction:"Both",description:"Win 25 Rescue matches in the Nightclub City Safehouse Arena"});
  featCollection.push({name:"The Club is the Bomb",                         category:"DLC",subcategory:"The Last Laugh",stars:1,points:10,faction:"Both",description:"Win a Bomb Threat match in the Nightclub City Safehouse Arena"});
  featCollection.push({name:"Exploding onto the Scene",                     category:"DLC",subcategory:"The Last Laugh",stars:1,points:10,faction:"Both",description:"Win 25 Bomb Threat matches in the Nightclub City Safehouse Arenas"});
  featCollection.push({name:"All Up in the Club",                           category:"DLC",subcategory:"The Last Laugh",stars:1,points:10,faction:"Both",description:"Win a Rescue match in the Nightclub City Safehouse Arena"});
  featCollection.push({name:"What DO You Do?",                              category:"DLC",subcategory:"The Last Laugh",stars:1,points:10,faction:"Both",description:"Win 25 Bomb Threat matches in the Police Station City Safehouse Arena"});
  featCollection.push({name:"Bombs, Away!",                                 category:"DLC",subcategory:"The Last Laugh",stars:1,points:10,faction:"Both",description:"Win a Bomb Threat match in the Police Station City Safehouse"});
  featCollection.push({name:"My Life as a Robot",                           category:"DLC",subcategory:"The Last Laugh",stars:1,points:10,faction:"Both",description:"Dispose of 50 bombs in the Assault: City Safehouses PvP Arena"});
  featCollection.push({name:"Together We Stand",                            category:"DLC",subcategory:"The Last Laugh",stars:3,points:50,faction:"Both",description:"Complete the Assault: Headquarters arena match without letting any iconic allies get knocked out"});
  featCollection.push({name:"Space Station Spiff",                          category:"DLC",subcategory:"The Last Laugh",stars:1,points:10,faction:"Both",description:"Win 20 Assault: Headquarters PvP arena matches in The Watchtower"});
  featCollection.push({name:"Watch Out!",                                   category:"DLC",subcategory:"The Last Laugh",stars:1,points:10,faction:"Both",description:"Win an Assault: Headquarters PvP arena match in The Watchtower"});
  featCollection.push({name:"Making a Name for Yourself",                   category:"DLC",subcategory:"The Last Laugh",stars:2,points:25,faction:"Both",description:"Knock out 50 iconic enemies in Assault: Headquarters arena matches"});
  featCollection.push({name:"Let's Get a Rally Going!",                     category:"DLC",subcategory:"The Last Laugh",stars:2,points:25,faction:"Both",description:"Rally 50 iconic allies in Assault: Headquarters arena matches"});
  featCollection.push({name:"Hacker",                                       category:"DLC",subcategory:"The Last Laugh",stars:1,points:10,faction:"Both",description:"Secure 50 terminals in the Hall of Doom in the Assault: Headquarters PvP Arena"});
  featCollection.push({name:"No Wired Hangar... Ever!",                     category:"DLC",subcategory:"The Last Laugh",stars:1,points:10,faction:"Both",description:"Unlock 10 devices in the Hangar in the Assault: Headquarters PvP Arena"});
  featCollection.push({name:"Swimming with the Sharks",                     category:"DLC",subcategory:"The Last Laugh",stars:1,points:10,faction:"Both",description:"Win an Assault: Headquarters PvP arena match in The Hall of Doom in 15 minutes or less"});
  featCollection.push({name:"Eat My Space Dust",                            category:"DLC",subcategory:"The Last Laugh",stars:1,points:10,faction:"Both",description:"Win an Assault: Headquarters PvP arena match in the Watchtower in 15 minutes or less"});
  featCollection.push({name:"Pest Control",                                 category:"DLC",subcategory:"The Last Laugh",stars:1,points:10,faction:"Both",description:"Defeat 100 goons in the Assault: Headquarters PvP arenas"});
  featCollection.push({name:"Who Watches the Watchtower",                   category:"DLC",subcategory:"The Last Laugh",stars:2,points:25,faction:"Both",description:"Win 100 Assault: Headquarters PvP arena matches in The Watchtower"});
  featCollection.push({name:"Hall of Doooooom!",                            category:"DLC",subcategory:"The Last Laugh",stars:2,points:25,faction:"Both",description:"Win 100 Assault: Headquarters PvP arena matches in The Hall of Doom"});
  featCollection.push({name:"A Real Hero",                                  category:"DLC",subcategory:"The Last Laugh",stars:1,points:10,faction:"Both",description:"Rally every iconic ally in the Assault: Headquarters PvP Arenas"});
  featCollection.push({name:"This House is Clean",                          category:"DLC",subcategory:"The Last Laugh",stars:3,points:50,faction:"Both",description:"Complete the feats: My Life as a Robot, Hostage Negotiator, and Spacial Delivery"});
  featCollection.push({name:"Space Invader",                                category:"DLC",subcategory:"The Last Laugh",stars:3,points:50,faction:"Both",description:"Unlock Ursa, Power Girl, Amon Sur and Kilowog Legendary Battle Arena Avatars"});
  featCollection.push({name:"Putting the Safe Back in Safehouse",           category:"DLC",subcategory:"The Last Laugh",stars:1,points:10,faction:"Both",description:"Win 100 Assault: City Safehouses arena matches"});
  featCollection.push({name:"Like a Black Hole in a Jar",                   category:"DLC",subcategory:"The Last Laugh",stars:1,points:10,faction:"Both",description:"Win a Graviton Recovery match in the Police Station City Safehouse Arena"});




function calculateArmor(character, startDateString, endDateString)
{
  var itype = "Gear";
  var totalArmor = 0;
  var timestamp = 0;
  var listMessage = "";
  var maxItemLength = 50;

  var startTS = convertDateStringToTimestamp(startDateString);
  var endTS = convertDateStringToTimestamp(endDateString);

  var itemTotalPerType = {};

  var armorType = [];
  armorType[0] = "Head";
  armorType[1] = "Back";
  armorType[2] = "Chest";
  armorType[3] = "Legs";
  armorType[4] = "Shoulders";
  armorType[5] = "Hands";
  armorType[6] = "Waist";
  armorType[7] = "Feet";

  for (var i=0; i<armorType.length; i++) {
    itemTotalPerType[armorType[i]] = 0;
  }

  var people = [];
  var itemTotalPerDay = {};
  var itemTotalPerPerson = {};

  if (character == "All characters") {
    people = Object.keys(allLogLinesJSON);
  }
  else {
    people = [ character ];
  }

  var earliestTS = 0;
  var latestTS = 0;

  people.forEach(function(person) {
    if (typeof(allLogLinesJSON[person]) != "undefined") {
      if (allLogLinesJSON[person].hasOwnProperty(itype)) {
        var itemArray = allLogLinesJSON[person][itype];

        for (var i=0; i<itemArray.length; i++) {
          timestamp = parseFloat(itemArray[i].time);
          if (earliestTS == 0) {
            earliestTS = timestamp;
            latestTS = timestamp;
          }
          else if (timestamp < earliestTS) {
            earliestTS = timestamp;
          }
          else if (timestamp > latestTS) {
            latestTS = timestamp;
          }
        }
      }
    }
  });

  if (earliestTS < startTS) { earliestTS = startTS; }
  if (latestTS > endTS) { latestTS = endTS; }

  for (var i=earliestTS; i<latestTS; i+=86400) {
    var currentDay = convertTimestampToDateString(i);
    itemTotalPerDay[currentDay] = 0;
  }

  people.forEach(function(person) {
    if (typeof(allLogLinesJSON[person]) != "undefined") {
      if (allLogLinesJSON[person].hasOwnProperty(itype)) {
        var itemArray = allLogLinesJSON[person][itype];

        for (var i=0; i<itemArray.length; i++) {
          timestamp = parseFloat(itemArray[i].time);

          if ((timestamp >= startTS) && (timestamp < endTS)) {
            var currentDay = convertTimestampToDateString(timestamp);
            if (typeof(itemTotalPerDay[currentDay]) == "undefined") {
              itemTotalPerDay[currentDay] = 1;
            }
            else {
              itemTotalPerDay[currentDay] += 1;
            }
            listMessage += printLineDate(itemArray[i].item, convertTimestampToDateString(timestamp), person, maxItemLength);
            totalArmor += 1;
            var foundOne = 0;

            for (var j=0; j<armorCollection.length; j++) {
              if (itemArray[i].item == armorCollection[j].name) {
                foundOne = 1;
                itemTotalPerType[armorCollection[j].type] += 1;
                break;
              }
            }
            if (foundOne == 0) {
              console.log("Unknown armor: " + itemArray[i].item);
            }
          }
        }
      }
    }
  });

  var Message = "";
  Message += "Character:         " + character + "\r\n";
  Message += "Date range:        " + startDateString + " through " + endDateString + "\r\n\r\n";
  Message += "Total Armor:     " + totalArmor + "\r\n\r\n";

  Message += "Armor".rpad(" ", maxItemLength) + "\tDate received\tCharacter\r\n\r\n";
  Message += listMessage;
  document.getElementById('StatsDisplay').style.display="block";
  document.getElementById('TableDisplay').style.display="none";
  document.getElementById("StatsDisplay").innerHTML = Message;
  drawItemChart(itemTotalPerDay, itype);
  drawItemPieChart(itemTotalPerType, itype);
}



function calculateArmorTiming(character, startDateString, endDateString)
{
  var itype = "Instance";
  var timestamp = 0;
  var listMessage = "";
  var maxItemLength = 50;
  var dateFeatAchieved = 0;
  var listMessage2 = "";
  var timesRan = 0;
  var currentDay = "";

  var startTS = convertDateStringToTimestamp(startDateString);
  var endTS = convertDateStringToTimestamp(endDateString);

  var people = [];

  // Try to find out if we don't have the armor collected yet
  //    so zero out an array for the armor
  var armorList = {};
  for (var i=0; i<armorCollection.length; i++) {
    armorList[armorCollection[i].name] = 0;
  }

  if (character == "All characters") {
    people = Object.keys(allLogLinesJSON);
  }
  else {
    people = [ character ];
  }

  people.forEach(function(person) {
    if (typeof(allLogLinesJSON[person]) != "undefined") {
      if (allLogLinesJSON[person].hasOwnProperty(itype)) {
        var itemArray = allLogLinesJSON[person][itype];

        for (var i=0; i<itemArray.length; i++) {
          listMessage += itemArray[i] + "\r\n";
          timesRan += 1;
        }
      }
      if (allLogLinesJSON[person].hasOwnProperty("Feats")) {
        var itemArray = allLogLinesJSON[person]["Feats"];
        for (var i=0; i<itemArray.length; i++) {
          if (itemArray[i].item == "Two Sides Of The Same Coin") {
            dateFeatAchieved = itemArray[i].time;
            break;
          }
        }
      }
      if (allLogLinesJSON[person].hasOwnProperty("Gear")) {
        var itemArray = allLogLinesJSON[person]["Gear"];
        for (var i=0; i<itemArray.length; i++) {
          for (var j=0; j<armorCollection.length; j++) {
            if (armorCollection[j].style == "Split Personality") {
              if (itemArray[i].item == armorCollection[j].name) {
                currentDay = convertTimestampToDateString(itemArray[i].time);

                listMessage2 += " Got Split Personality " + armorCollection[j].type + " on " + currentDay + "\r\n";
              }
            }
          }
        }
      }
    }
  });

  var Message = "";
  Message += "Character:         " + character + "\r\n";
  Message += "Date range:        " + startDateString + " through " + endDateString + "\r\n\r\n";
  Message += "Attempted Old Gotham Penguin Challenge: " + timesRan + " times\r\n\r\n";
  if (dateFeatAchieved == 0) {
    currentDay = "Not achieved yet";
  }
  else {
    currentDay = convertTimestampToDateString(dateFeatAchieved);
  }
  Message += "Date Split Personality Feat achieved: " + currentDay + "\r\n\r\n";
  Message += "Dates got armor pieces:\r\n\r\n";
  Message += listMessage2 + "\r\n\r\n";
  Message += "Dates Old Gotham Penguin challenge ran:\r\n\r\n";
  Message += listMessage;

  document.getElementById('StatsDisplay').style.display="block";
  document.getElementById('TableDisplay').style.display="none";
  document.getElementById("StatsDisplay").innerHTML = Message;

  // Blank out any existing line or pie charts since I don't have any for this section of data to display
  document.getElementById('LeftChartDiv').innerHTML = "";
  document.getElementById('RightChartDiv').innerHTML = "";
}


function calculateVault(character, startDateString, endDateString)
{
  var itype = "VaultTrips";
  var timestamp = 0;
  var listMessage = "";
  var maxItemLength = 50;
  var listMessage2 = "";
  var timesRan = 0;
  var currentDay = "";

  var startTS = convertDateStringToTimestamp(startDateString);
  var endTS = convertDateStringToTimestamp(endDateString);

  var people = [];

  // Try to find out if we don't have the armor collected yet
  //    so zero out an array for the armor
  var armorList = {};
  for (var i=0; i<armorCollection.length; i++) {
    armorList[armorCollection[i].name] = 0;
  }

  if (character == "All characters") {
    people = Object.keys(allLogLinesJSON);
  }
  else {
    people = [ character ];
  }

  people.forEach(function(person) {
    if (typeof(allLogLinesJSON[person]) != "undefined") {
      if (allLogLinesJSON[person].hasOwnProperty(itype)) {
        var itemArray = allLogLinesJSON[person][itype];
        itemArray.sort();

        for (var i=0; i<itemArray.length; i++) {
          currentDay = convertTimestampToDateString(itemArray[i]);
          listMessage += currentDay + "\t" + person + "\r\n";
          timesRan += 1;
        }
      }
      if (allLogLinesJSON[person].hasOwnProperty("Gear")) {
        var itemArray = allLogLinesJSON[person]["Gear"];
        for (var i=0; i<itemArray.length; i++) {
          for (var j=0; j<armorCollection.length; j++) {
            if (armorCollection[j].drops == "Present in Vault") {
              if (itemArray[i].item == armorCollection[j].name) {
                currentDay = convertTimestampToDateString(itemArray[i].time);
                listMessage2 += currentDay + "\t" + person + "\t" + armorCollection[j].name + "\r\n";
                armorList[itemArray[i].item] += 1;
              }
            }
          }
        }
      }
    }
  });

  var Message = "";
  Message += "Character:         " + character + "\r\n";
  Message += "Date range:        " + startDateString + " through " + endDateString + "\r\n\r\n";
  Message += "Times run vault: " + timesRan + " times\r\n\r\n";
  Message += "Unobtained Vault items:\r\n";

  for (var i=0; i<armorCollection.length; i++) {
    if (armorCollection[i].drops == "Present in Vault") {
      if (armorList[armorCollection[i].name] < 1) {
        Message += " " + armorCollection[i].name + "\r\n";
      }
    }
  }

  Message += "\r\nDates Vault ran:\r\n\r\n";
  Message += listMessage;
  Message += "\r\nDates got vault items:\r\n\r\n";
  Message += listMessage2 + "\r\n\r\n";

  document.getElementById('StatsDisplay').style.display="block";
  document.getElementById('TableDisplay').style.display="none";
  document.getElementById("StatsDisplay").innerHTML = Message;

  // Blank out any existing line or pie charts since I don't have any for this section of data to display
  document.getElementById('LeftChartDiv').innerHTML = "";
  document.getElementById('RightChartDiv').innerHTML = "";
}


function calculateArmorNeeded(character, startDateString, endDateString)
{
  var itype = "Gear";
  var totalArmor = 0;
  var timestamp = 0;
  var listMessage = "";
  var maxItemLength = 50;

  var startTS = convertDateStringToTimestamp(startDateString);
  var endTS = convertDateStringToTimestamp(endDateString);

  var people = [];

  // Try to find out if we don't have the armor collected yet
  //    so zero out an array for the armor
  var armorList = {};
  for (var i=0; i<armorCollection.length; i++) {
    armorList[armorCollection[i].name] = 0;
  }

  if (character == "All characters") {
    people = Object.keys(allLogLinesJSON);
  }
  else {
    people = [ character ];
  }

  people.forEach(function(person) {
    if (typeof(allLogLinesJSON[person]) != "undefined") {
      if (allLogLinesJSON[person].hasOwnProperty(itype)) {
        var itemArray = allLogLinesJSON[person][itype];

        for (var i=0; i<itemArray.length; i++) {
          timestamp = parseFloat(itemArray[i].time);

          if ((timestamp >= startTS) && (timestamp < endTS)) {
            if (typeof(armorList[itemArray[i].item]) == "undefined") {
              armorList[itemArray[i].item] = 0;
            }
            armorList[itemArray[i].item] += 1;
            totalArmor += 1;
          }
        }
      }
    }
  });

//  var Message = "";
//  Message += "Character:         " + character + "\r\n";
//  Message += "Date range:        " + startDateString + " through " + endDateString + "\r\n\r\n";
//  Message += "Unobtained armor:\r\n\r\n";

//  for (var i=0; i<armorCollection.length; i++) {
//    if (armorArray[i] == 0) {
//      Message += armorCollection[i].name.rpad(" ", maxItemLength) + "\t" + armorCollection[i].role.rpad(" ", 13) + armorCollection[i].drops + "\r\n";
//    }
//  }


  var printOnce = 1;

  var results = '';
  results +=  'Character:         ' + character + '<br>';
  results +=  'Date range:        ' + startDateString + ' through ' + endDateString  + '<br>';
  results +=  'Total Armor obtained: ' + totalArmor + '<br><br>';
  results +=  'Unobtained armor: (click on link to expand)<br>';


//  armorCollection.push({name:"Supergirl's Kandorian Battleboots",type:"Feet",role:"DPS",style:"Supergirl",drops:"Doctor Psycho"});

  var armorType = [];
  armorType[0] = "Head";
  armorType[1] = "Back";
  armorType[2] = "Chest";
  armorType[3] = "Legs";
  armorType[4] = "Shoulders";
  armorType[5] = "Hands";
  armorType[6] = "Waist";
  armorType[7] = "Feet";

  results +=  '<ul class="mktree">';

  results += '  <li>DPS/';
  results += '    <ul>';

  for (var j=0; j<armorType.length; j++) {
    for (var i=0; i<armorCollection.length; i++) {
      if (armorCollection[i].role == "DPS") {
        if (armorCollection[i].type == armorType[j]) {
          if (armorList[armorCollection[i].name] < 1) {
            if (printOnce == 1) {
              results += '      <li>' + armorType[j] + '/';
              results += '        <ul>';
              printOnce = 2;
            }
            results += '          <li>' + armorCollection[i].name + ' (Style:' + armorCollection[i].style + ')<ul><li>' + '(Dropped by:' + armorCollection[i].drops + ')</li></ul></li>';
          }
        }
      }
    }
    if (printOnce == 2) {
      results += '        </ul>';
      results += '      </li>';
      printOnce = 1;
    }
  }

  results += '    </ul>';
  results += '  </li>';

  results += '  <li>Controller/';
  results += '    <ul>';
  for (var j=0; j<armorType.length; j++) {
    for (var i=0; i<armorCollection.length; i++) {
      if (armorCollection[i].role == "Controller") {
        if (armorCollection[i].type == armorType[j]) {
          if (armorList[armorCollection[i].name] < 1) {
            if (printOnce == 1) {
              results += '      <li>' + armorType[j] + '/';
              results += '        <ul>';
              printOnce = 2;
            }
            results += '          <li>' + armorCollection[i].name + ' (Style:' + armorCollection[i].style + ')<ul><li>' + '(Dropped by:' + armorCollection[i].drops + ')</li></ul></li>';
          }
        }
      }
    }
    if (printOnce == 2) {
      results += '        </ul>';
      results += '      </li>';
      printOnce = 1;
    }
  }
  results += '    </ul>';
  results += '  </li>';

  results += '  <li>Tank/';
  results += '    <ul>';
  for (var j=0; j<armorType.length; j++) {
    for (var i=0; i<armorCollection.length; i++) {
      if (armorCollection[i].role == "Tank") {
        if (armorCollection[i].type == armorType[j]) {
          if (armorList[armorCollection[i].name] < 1) {
            if (printOnce == 1) {
              results += '      <li>' + armorType[j] + '/';
              results += '        <ul>';
              printOnce = 2;
            }
            results += '          <li>' + armorCollection[i].name + ' (Style:' + armorCollection[i].style + ')<ul><li>' + '(Dropped by:' + armorCollection[i].drops + ')</li></ul></li>';
          }
        }
      }
    }
    if (printOnce == 2) {
      results += '        </ul>';
      results += '      </li>';
      printOnce = 1;
    }
  }
  results += '    </ul>';
  results += '  </li>';

  results += '  <li>Healer/';
  results += '    <ul>';
  for (var j=0; j<armorType.length; j++) {
    for (var i=0; i<armorCollection.length; i++) {
      if (armorCollection[i].role == "Healer") {
        if (armorCollection[i].type == armorType[j]) {
          if (armorList[armorCollection[i].name] < 1) {
            if (printOnce == 1) {
              results += '      <li>' + armorType[j] + '/';
              results += '        <ul>';
              printOnce = 2;
            }
            results += '          <li>' + armorCollection[i].name + ' (Style:' + armorCollection[i].style + ')<ul><li>' + '(Dropped by:' + armorCollection[i].drops + ')</li></ul></li>';
          }
        }
      }
    }
    if (printOnce == 2) {
      results += '        </ul>';
      results += '      </li>';
      printOnce = 1;
    }
  }
  results += '    </ul>';
  results += '  </li>';

  results += '</ul>';

  document.getElementById("TableDisplay").innerHTML = results;
  convertTrees();

  document.getElementById('StatsDisplay').style.display="none";
  document.getElementById('TableDisplay').style.display="block";

  // Blank out any existing line or pie charts since I don't have any for this section of data to display
  document.getElementById('LeftChartDiv').innerHTML = "";
  document.getElementById('RightChartDiv').innerHTML = "";
}



// ********************************************************************
// *	calculateFeats
// *	Go through all of log lines and count up how
// *	many feats the character received
// *	    For example: 1335101764: ClassicFumbles completed a feat: Pod Breaker
// ********************************************************************

function calculateFeats(character, startDateString, endDateString)
{
  var itype = "Feats";
  var total_feats = 0;
  var timestamp = 0;
  var listMessage = "";
  var maxItemLength = 50;

  var startTS = convertDateStringToTimestamp(startDateString);
  var endTS = convertDateStringToTimestamp(endDateString);

  var people = [];
  var itemTotalPerDay = {};
  var itemTotalPerPerson = {};

  if (character == "All characters") {
    people = Object.keys(allLogLinesJSON);
  }
  else {
    people = [ character ];
  }

  var mainCategories = "Summary Exploration Styles Alerts Renown Seasonal General Solo Player vs. Player Raids Duos DLC R&D";
  var featcount = 610;  // On lost_sapphire

  var earliestTS = 0;
  var latestTS = 0;

  people.forEach(function(person) {
    if (typeof(allLogLinesJSON[person]) != "undefined") {
      if (allLogLinesJSON[person].hasOwnProperty(itype)) {
        var itemArray = allLogLinesJSON[person][itype];

        for (var i=0; i<itemArray.length; i++) {
          timestamp = parseFloat(itemArray[i].time);
          if (earliestTS == 0) {
            earliestTS = timestamp;
            latestTS = timestamp;
          }
          else if (timestamp < earliestTS) {
            earliestTS = timestamp;
          }
          else if (timestamp > latestTS) {
            latestTS = timestamp;
          }
        }
      }
    }
  });

  if (earliestTS < startTS) { earliestTS = startTS; }
  if (latestTS > endTS) { latestTS = endTS; }

  for (var i=earliestTS; i<latestTS; i+=86400) {
    var currentDay = convertTimestampToDateString(i);
    itemTotalPerDay[currentDay] = 0;
  }

  var maxExploration = 0;
  var maxAlerts = 0;
  var maxSeasonal = 0;
  var maxSolo = 0;
  var maxRaids = 0;
  var maxDLC = 0;
  var maxStyles = 0;
  var maxRenown = 0;
  var maxGeneral = 0;
  var maxPVP = 0;
  var maxDuos = 0;
  var maxRandD = 0;

  var numExploration = 0;
  var numAlerts = 0;
  var numSeasonal = 0;
  var numSolo = 0;
  var numRaids = 0;
  var numDLC = 0;
  var numStyles = 0;
  var numRenown = 0;
  var numGeneral = 0;
  var numPVP = 0;
  var numDuos = 0;
  var numRandD = 0;

  people.forEach(function(person) {
    if (typeof(allLogLinesJSON[person]) != "undefined") {
      if (allLogLinesJSON[person].hasOwnProperty(itype)) {

        faction = determineFaction(person);

        maxExploration = 0;
        maxAlerts = 0;
        maxSeasonal= 0;
        maxSolo = 0;
        maxRaids = 0;
        maxDLC = 0;
        maxStyles = 0;
        maxRenown = 0;
        maxGeneral = 0;
        maxPVP = 0;
        maxDuos = 0;
        maxRandD = 0;
        for (var j=0; j<featCollection.length; j++) {
          if ((featCollection[j].faction == faction) || (featCollection[j].faction == "Both")) {
            if (featCollection[j].category == "Exploration")            { maxExploration += 1; }
            else if (featCollection[j].category == "Alerts")            { maxAlerts += 1; }
            else if (featCollection[j].category == "Seasonal")          { maxSeasonal += 1; }
            else if (featCollection[j].category == "Solo")              { maxSolo += 1; }
            else if (featCollection[j].category == "Raids")             { maxRaids += 1; }
            else if (featCollection[j].category == "DLC")               { maxDLC += 1; }
            else if (featCollection[j].category == "Styles")            { maxStyles += 1; }
            else if (featCollection[j].category == "Renown")            { maxRenown += 1; }
            else if (featCollection[j].category == "General")           { maxGeneral += 1; }
            else if (featCollection[j].category == "Player vs Player")  { maxPVP += 1; }
            else if (featCollection[j].category == "Duos")              { maxDuos += 1; }
            else if (featCollection[j].category == "R&D")               { maxRandD += 1; }
          }
        }

        var itemArray = allLogLinesJSON[person][itype];

        for (var i=0; i<itemArray.length; i++) {
          timestamp = parseFloat(itemArray[i].time);

          if ((timestamp >= startTS) && (timestamp < endTS)) {
            listMessage += printLineDate(itemArray[i].item, convertTimestampToDateString(timestamp), person, maxItemLength);
            total_feats += 1;
            var currentDay = convertTimestampToDateString(timestamp);
            if (typeof(itemTotalPerDay[currentDay]) == "undefined") {
              itemTotalPerDay[currentDay] = 1;
            }
            else {
              itemTotalPerDay[currentDay] += 1;
            }

            var foundOne = 0;

            for (var j=0; j<featCollection.length; j++) {
              if (featCollection[j].name == itemArray[i].item) {
                foundOne = 1;
                var cat = featCollection[j].category;

                if (cat == "Exploration")            { numExploration += 1; }
                else if (cat == "Alerts")            { numAlerts += 1; }
                else if (cat == "Seasonal")          { numSeasonal += 1; }
                else if (cat == "Solo")              { numSolo += 1; }
                else if (cat == "Raids")             { numRaids += 1; }
                else if (cat == "DLC")               { numDLC += 1; }
                else if (cat == "Styles")            { numStyles += 1; }
                else if (cat == "Renown")            { numRenown += 1; }
                else if (cat == "General")           { numGeneral += 1; }
                else if (cat == "Player vs Player")  { numPVP += 1; }
                else if (cat == "Duos")              { numDuos += 1; }
                else if (cat == "R&D")               { numRandD += 1; }

                if (typeof(itemTotalPerPerson[cat]) == "undefined") {
                  itemTotalPerPerson[cat] = 1;
                }
                else {
                  itemTotalPerPerson[cat] += 1;
                }
                break;
              }
            }
            if (foundOne == 0) {
              console.log("Unknown feat: " + itemArray[i].item);
            }
          }
        }
      }
    }
  });

  var Message = "";
  Message += "Character:         " + character + "\r\n";
  Message += "Date range:        " + startDateString + " through " + endDateString + "\r\n\r\n";
  Message += "Total feats:       " + total_feats + "\r\n\r\n";

  Message += "Feat Summary\r\n\r\n";
  Message += "Exploration       " + numExploration + "/" + maxExploration + "\r\n";
  Message += "Alerts            " + numAlerts + "/" + maxAlerts + "\r\n";
  Message += "Seasonal          " + numSeasonal + "/" + maxSeasonal + "\r\n";
  Message += "Solo              " + numSolo + "/" + maxSolo + "\r\n";
  Message += "Raids             " + numRaids + "/" + maxRaids + "\r\n";
  Message += "DLC               " + numDLC + "/" + maxDLC + "\r\n";
  Message += "Styles            " + numStyles + "/" + maxStyles + "\r\n";
  Message += "Renown            " + numRenown + "/" + maxRenown + "\r\n";
  Message += "General           " + numGeneral + "/" + maxGeneral + "\r\n";
  Message += "Player vs. Player " + numPVP + "/" + maxPVP + "\r\n";
  Message += "Duos              " + numDuos + "/" + maxDuos + "\r\n";
  Message += "R&D               " + numRandD + "/" + maxRandD + "\r\n\r\n";

  Message += "Feat Listing\r\n\r\n";
  Message += "Feat".rpad(" ", maxItemLength) + "\tDate received\tCharacter\r\n\r\n";
  Message += listMessage;
  document.getElementById('StatsDisplay').style.display="block";
  document.getElementById('TableDisplay').style.display="none";
  document.getElementById("StatsDisplay").innerHTML = Message;
  drawItemChart(itemTotalPerDay, itype);
  drawItemPieChart(itemTotalPerPerson, itype);
}


function determineFaction(character)
{
  var itype = "Feats";

  if (allLogLinesJSON[character].hasOwnProperty(itype)) {
    var itemArray = allLogLinesJSON[character][itype];
    for (var i=0; i<itemArray.length; i++) {
      for (var j=0; j<featCollection.length; j++) {
        if (featCollection[j].faction != "Both") {
          if (itemArray[i].item == featCollection[j].name) {
            return featCollection[j].faction;
          }
        }
      }
    }
  }
  return "Unknown";
}

function getFeatFaction(featName)
{
  for (var j=0; j<featCollection.length; j++) {
    if (featName == featCollection[j].name) {
      return featCollection[j].faction;
    }
  }
  alert("ERROR: we have a feat that is not in the feat collection" + featName);
  console.log("ERROR: we have a feat that is not in the feat collection" + featName);
  return "None";
}


function calculateFeatsNeeded(character, startDateString, endDateString)
{
  var itype = "Feats";
  var total_feats = 0;
  var timestamp = 0;
  var listMessage = "";
  var maxItemLength = 50;
  var faction = "";

  var startTS = convertDateStringToTimestamp(startDateString);
  var endTS = convertDateStringToTimestamp(endDateString);

  var people = [];
  var itemTotalPerDay = {};
  var itemTotalPerPerson = {};

  // Try to find out if we don't have the feat yet

  var featList = {};
  for (var i=0; i<featCollection.length; i++) {
    featList[featCollection[i].name] = 0;
  }

  if (character == "All characters") {
    people = Object.keys(allLogLinesJSON);
  }
  else {
    people = [ character ];
  }

  people.forEach(function(person) {
    if (typeof(allLogLinesJSON[person]) != "undefined") {

      faction = determineFaction(person);
      if (allLogLinesJSON[person].hasOwnProperty(itype)) {
        var itemArray = allLogLinesJSON[person][itype];

        for (var i=0; i<itemArray.length; i++) {
          timestamp = parseFloat(itemArray[i].time);

          if ((timestamp >= startTS) && (timestamp < endTS)) {
            if (typeof(featList[itemArray[i].item]) == "undefined") {
              featList[itemArray[i].item] = 0;
            }
            featList[itemArray[i].item] += 1;
            total_feats += 1;
          }
        }
      }
      // Set all the feats we can't get to 1 so it won't display them
      for (var i=0; i<featCollection.length; i++) {
        if (((featCollection[i].faction == "Hero") && (faction == "Villain")) ||
            ((featCollection[i].faction == "Villain") && (faction == "Hero"))) {
          featList[featCollection[i].name] = 1;
        }
      }
    }
  });

  // They seem to have changed this feat at some point so just count it once, not as two separate feats

  if ((featList["Wanted: Knocked Out or Alive"] > 0) && (featList["WANTED: Knocked Out or Alive"] == 0)) {
    featList["WANTED: Knocked Out or Alive"] = featList["Wanted: Knocked Out or Alive"];
  }
  else if ((featList["WANTED: Knocked Out or Alive"] > 0) && (featList["Wanted: Knocked Out or Alive"] == 0)) {
    featList["Wanted: Knocked Out or Alive"] = featList["WANTED: Knocked Out or Alive"];
  }
  else if ((featList["WANTED: Knocked Out or Alive"] == 0) && (featList["Wanted: Knocked Out or Alive"] == 0)) {
    featList["Wanted: Knocked Out or Alive"] = 1;
  }

  var printOnce = 1;

  var results = '';
  results +=  'Character:         ' + character + '<br>';
  results +=  'Date range:        ' + startDateString + ' through ' + endDateString  + '<br>';
  results +=  'Total Feats obtained: ' + total_feats + '<br><br>';
  results +=  'Unobtained feats: (click on link to expand)<br>';


  var categoriesExploration = [ "General", "Raids", "Metropolis", "Alerts", "Gotham" ];
  results +=  '<ul class="mktree">';

  var printIntro = 1;

  for (var j=0; j<categoriesExploration.length; j++) {
    for (var i=0; i<featCollection.length; i++) {
      if (featCollection[i].category == "Exploration") {
        if (featCollection[i].subcategory == categoriesExploration[j]) {
          if (featList[featCollection[i].name] < 1) {
            if (printIntro == 1) {
              printIntro = 0;
              results += '  <li>Exploration/';
              results += '    <ul>';
            }
            if (printOnce == 1) {
              results += '      <li>' + categoriesExploration[j] + '/';
              results += '        <ul>';
              printOnce = 2;
            }
            results += '          <li>' + featCollection[i].name + ' (' + featCollection[i].stars + ' stars' + ')<ul><li>' + featCollection[i].description + '</li></ul></li>';
          }
        }
      }
    }
    if (printOnce == 2) {
      results += '        </ul>';
      results += '      </li>';
      printOnce = 1;
    }
  }

  if (printIntro == 0) {
    results += '    </ul>';
    results += '  </li>';
    printIntro = 1;
  }

  var categoriesStyles = [ "General", "Theme", "Iconic" ];

  for (var j=0; j<categoriesStyles.length; j++) {
    for (var i=0; i<featCollection.length; i++) {
      if (featCollection[i].category == "Styles") {
        if (featCollection[i].subcategory == categoriesStyles[j]) {
          if (featList[featCollection[i].name] < 1) {
            if (printIntro == 1) {
              printIntro = 0;
              results += '  <li>Styles/';
              results += '    <ul>';
            }
            if (printOnce == 1) {
              results += '      <li>' + categoriesStyles[j] + '/';
              results += '        <ul>';
              printOnce = 2;
            }
            results += '          <li>' + featCollection[i].name + ' (' + featCollection[i].stars + ' stars' + ')<ul><li>' + featCollection[i].description + '</li></ul></li>';
          }
        }
      }
    }
    if (printOnce == 2) {
      results += '        </ul>';
      results += '      </li>';
      printOnce = 1;
    }
  }

  if (printIntro == 0) {
    results += '    </ul>';
    results += '  </li>';
    printIntro = 1;
  }

  var categoriesAlerts = [ "General", "Normal", "Hard" ];

  for (var j=0; j<categoriesAlerts.length; j++) {
    for (var i=0; i<featCollection.length; i++) {
      if (featCollection[i].category == "Alerts") {
        if (featCollection[i].subcategory == categoriesAlerts[j]) {
          if (featList[featCollection[i].name] < 1) {
            if (printIntro == 1) {
              printIntro = 0;
              results += '  <li>Alerts/';
              results += '    <ul>';
            }
            if (printOnce == 1) {
              results += '      <li>' + categoriesAlerts[j] + '/';
              results += '        <ul>';
              printOnce = 2;
            }
            results += '          <li>' + featCollection[i].name + ' (' + featCollection[i].stars + ' stars' + ')<ul><li>' + featCollection[i].description + '</li></ul></li>';
          }
        }
      }
    }
    if (printOnce == 2) {
      results += '        </ul>';
      results += '      </li>';
      printOnce = 1;
    }
  }

  if (printIntro == 0) {
    results += '    </ul>';
    results += '  </li>';
    printIntro = 1;
  }

  for (var i=0; i<featCollection.length; i++) {
    if (featCollection[i].category == "Renown") {
      if (featList[featCollection[i].name] < 1) {
        if (printIntro == 1) {
          printIntro = 0;
          results += '  <li>Renown/';
          results += '    <ul>';
        }
        results += '          <li>' + featCollection[i].name + ' (' + featCollection[i].stars + ' stars' + ')<ul><li>' + featCollection[i].description + '</li></ul></li>';
      }
    }
  }

  if (printIntro == 0) {
    results += '    </ul>';
    results += '  </li>';
    printIntro = 1;
  }

  var categoriesSeasonal = [ "Valentine's Day", "Springtime", "St. Patrick's Day",
                             "Spooktacular", "Winter Holidays" ];
  for (var j=0; j<categoriesSeasonal.length; j++) {
    for (var i=0; i<featCollection.length; i++) {
      if (featCollection[i].category == "Seasonal") {
        if (featCollection[i].subcategory == categoriesSeasonal[j]) {
          if (featList[featCollection[i].name] < 1) {
            if (printIntro == 1) {
              printIntro = 0;
              results += '  <li>Seasonal/';
              results += '    <ul>';
            }
            if (printOnce == 1) {
              results += '      <li>' + categoriesSeasonal[j] + '/';
              results += '        <ul>';
              printOnce = 2;
            }
            results += '          <li>' + featCollection[i].name + ' (' + featCollection[i].stars + ' stars' + ')<ul><li>' + featCollection[i].description + '</li></ul></li>';
          }
        }
      }
    }
    if (printOnce == 2) {
      results += '        </ul>';
      results += '      </li>';
      printOnce = 1;
    }
  }

  if (printIntro == 0) {
    results += '    </ul>';
    results += '  </li>';
    printIntro = 1;
  }

  var categoriesGeneral = [ "General", "Tokens of Merit", "Collectibles" ];

  for (var j=0; j<categoriesGeneral.length; j++) {
    for (var i=0; i<featCollection.length; i++) {
      if (featCollection[i].category == "General") {
        if (featCollection[i].subcategory == categoriesGeneral[j]) {
          if (featList[featCollection[i].name] < 1) {
            if (printIntro == 1) {
              printIntro = 0;
              results += '  <li>General/';
              results += '    <ul>';
            }
            if (printOnce == 1) {
              results += '      <li>' + categoriesGeneral[j] + '/';
              results += '        <ul>';
              printOnce = 2;
            }
            results += '          <li>' + featCollection[i].name + ' (' + featCollection[i].stars + ' stars' + ')<ul><li>' + featCollection[i].description + '</li></ul></li>';
          }
        }
      }
    }
    if (printOnce == 2) {
      results += '        </ul>';
      results += '      </li>';
      printOnce = 1;
    }
  }

  if (printIntro == 0) {
    results += '    </ul>';
    results += '  </li>';
    printIntro = 1;
  }

  var categoriesRaces = [ "General", "Flight", "Acrobat", "Speedster" ];

  for (var j=0; j<categoriesRaces.length; j++) {
    for (var i=0; i<featCollection.length; i++) {
      if (featCollection[i].category == "Races") {
        if (featCollection[i].subcategory == categoriesRaces[j]) {
          if (featList[featCollection[i].name] < 1) {
            if (printIntro == 1) {
              printIntro = 0;
              results += '  <li>Races/';
              results += '    <ul>';
            }
            if (printOnce == 1) {
              results += '      <li>' + categoriesRaces[j] + '/';
              results += '        <ul>';
              printOnce = 2;
            }
            results += '          <li>' + featCollection[i].name + ' (' + featCollection[i].stars + ' stars' + ')<ul><li>' + featCollection[i].description + '</li></ul></li>';
          }
        }
      }
    }
    if (printOnce == 2) {
      results += '        </ul>';
      results += '      </li>';
      printOnce = 1;
    }
  }

  if (printIntro == 0) {
    results += '    </ul>';
    results += '  </li>';
    printIntro = 1;
  }

  var categoriesSolo = [ "General", "Hideouts", "Iconic Battles", "Contacts", "Survival" ];

  for (var j=0; j<categoriesSolo.length; j++) {
    for (var i=0; i<featCollection.length; i++) {
      if (featCollection[i].category == "Solo") {
        if (featCollection[i].subcategory == categoriesSolo[j]) {
          if (featList[featCollection[i].name] < 1) {
            if (printIntro == 1) {
              printIntro = 0;
              results += '  <li>Solo/';
              results += '    <ul>';
            }
            if (printOnce == 1) {
              results += '      <li>' + categoriesSolo[j] + '/';
              results += '        <ul>';
              printOnce = 2;
            }
            results += '          <li>' + featCollection[i].name + ' (' + featCollection[i].stars + ' stars' + ')<ul><li>' + featCollection[i].description + '</li></ul></li>';
          }
        }
      }
    }
    if (printOnce == 2) {
      results += '        </ul>';
      results += '      </li>';
      printOnce = 1;
    }
  }

  if (printIntro == 0) {
    results += '    </ul>';
    results += '  </li>';
    printIntro = 1;
  }

  var categoriesPVP = [ "General", "Dueling", "Legendary Battles", "Arenas" ];

  for (var j=0; j<categoriesPVP.length; j++) {
    for (var i=0; i<featCollection.length; i++) {
      if (featCollection[i].category == "Player vs Player") {
        if (featCollection[i].subcategory == categoriesPVP[j]) {
          if (featList[featCollection[i].name] < 1) {
            if (printIntro == 1) {
              printIntro = 0;
              results += '  <li>Player vs. Player/';
              results += '    <ul>';
            }
            if (printOnce == 1) {
              results += '      <li>' + categoriesPVP[j] + '/';
              results += '        <ul>';
              printOnce = 2;
            }
            results += '          <li>' + featCollection[i].name + ' (' + featCollection[i].stars + ' stars' + ')<ul><li>' + featCollection[i].description + '</li></ul></li>';
          }
        }
      }
    }
    if (printOnce == 2) {
      results += '        </ul>';
      results += '      </li>';
      printOnce = 1;
    }
  }

  if (printIntro == 0) {
    results += '    </ul>';
    results += '  </li>';
    printIntro = 1;
  }

  for (var i=0; i<featCollection.length; i++) {
    if (featCollection[i].category == "Raids") {
      if (featList[featCollection[i].name] < 1) {
        if (printIntro == 1) {
          printIntro = 0;
          results += '  <li>Raids/';
          results += '    <ul>';
        }
        results += '          <li>' + featCollection[i].name + ' (' + featCollection[i].stars + ' stars' + ')<ul><li>' + featCollection[i].description + '</li></ul></li>';
      }
    }
  }

  if (printIntro == 0) {
    results += '    </ul>';
    results += '  </li>';
    printIntro = 1;
  }

  var categoriesDuos = [ "General", "Speed Force", "Hideouts" ];

  for (var j=0; j<categoriesDuos.length; j++) {
    for (var i=0; i<featCollection.length; i++) {
      if (featCollection[i].category == "Duos") {
        if (featCollection[i].subcategory == categoriesDuos[j]) {
          if (featList[featCollection[i].name] < 1) {
            if (printIntro == 1) {
              printIntro = 0;
              results += '  <li>Duos/';
              results += '    <ul>';
            }
            if (printOnce == 1) {
              results += '      <li>' + categoriesDuos[j] + '/';
              results += '        <ul>';
              printOnce = 2;
            }
            results += '          <li>' + featCollection[i].name + ' (' + featCollection[i].stars + ' stars' + ')<ul><li>' + featCollection[i].description + '</li></ul></li>';
          }
        }
      }
    }
    if (printOnce == 2) {
      results += '        </ul>';
      results += '      </li>';
      printOnce = 1;
    }
  }

  if (printIntro == 0) {
    results += '    </ul>';
    results += '  </li>';
    printIntro = 1;
  }

  var categoriesDLC = [ "Lightning Strikes", "Fight for the Light", "Battle for Earth", "The Last Laugh" ];

  for (var j=0; j<categoriesDLC.length; j++) {
    for (var i=0; i<featCollection.length; i++) {
      if (featCollection[i].category == "DLC") {
        if (featCollection[i].subcategory == categoriesDLC[j]) {
          if (featList[featCollection[i].name] < 1) {
            if (printIntro == 1) {
              printIntro = 0;
              results += '  <li>DLC/';
              results += '    <ul>';
            }
            if (printOnce == 1) {
              results += '      <li>' + categoriesDLC[j] + '/';
              results += '        <ul>';
              printOnce = 2;
            }
            results += '          <li>' + featCollection[i].name + ' (' + featCollection[i].stars + ' stars' + ')<ul><li>' + featCollection[i].description + '</li></ul></li>';
          }
        }
      }
    }
    if (printOnce == 2) {
      results += '        </ul>';
      results += '      </li>';
      printOnce = 1;
    }
  }

  if (printIntro == 0) {
    results += '    </ul>';
    results += '  </li>';
    printIntro = 1;
  }

  var categoriesRandD = [ "General", "Assembly", "Parts" ];

  for (var j=0; j<categoriesRandD.length; j++) {
    for (var i=0; i<featCollection.length; i++) {
      if (featCollection[i].category == "R&D") {
        if (featCollection[i].subcategory == categoriesRandD[j]) {
          if (featList[featCollection[i].name] < 1) {
            if (printIntro == 1) {
              printIntro = 0;
              results += '  <li>R&D/';
              results += '    <ul>';
            }
            if (printOnce == 1) {
              results += '      <li>' + categoriesRandD[j] + '/';
              results += '        <ul>';
              printOnce = 2;
            }
            results += '          <li>' + featCollection[i].name + ' (' + featCollection[i].stars + ' stars' + ')<ul><li>' + featCollection[i].description + '</li></ul></li>';
          }
        }
      }
    }
    if (printOnce == 2) {
      results += '        </ul>';
      results += '      </li>';
      printOnce = 1;
    }
  }

  if (printIntro == 0) {
    results += '    </ul>';
    results += '  </li>';
    printIntro = 1;
  }

  results += '</ul>';

  document.getElementById("TableDisplay").innerHTML = results;
  convertTrees();

  document.getElementById('StatsDisplay').style.display="none";
  document.getElementById('TableDisplay').style.display="block";

  // Blank out any existing line or pie charts since I don't have any for this section of data to display
  document.getElementById('LeftChartDiv').innerHTML = "";
  document.getElementById('RightChartDiv').innerHTML = "";


//  var Message = "Feat Name\tCategory\t\tStars\tDescription\r\n\r\n";
//  for (var i=0; i<featCollection.length; i++) {
//    if (featArray[i] == 0) {
//      Message += featCollection[i].name.rpad(" ", maxItemLength) + "\r\n";
//      Message += "\t" + featCollection[i].category.rpad(" ", 13) + featCollection[i].subcategory + "\t" + featCollection[i].stars + "\t" + featCollection[i].description + "\r\n\r\n";
//    }
//  }
}


// ********************************************************************
// *	dataOptionExecute
// *	is called whenever the user changes the type of data to view
// ********************************************************************

function dataOptionExecute()
{
  if (dataLoadinProgress) { return; }

  // Hide the progress bar since combat log is loaded
  document.getElementById('progress_bar').style.display="none";

  // Get character selected using GUI
  var x=document.getElementById("DropDownMenu_Character").selectedIndex;
  var y=document.getElementById("DropDownMenu_Character").options;
  var person = y[x].text;

  // Get date range selected using GUI

  var startDateString = document.getElementById("SDate").value;
  if (startDateString == "") {
    var startStr = new Date("January 1, 2011 01:00:00");
    startDateString = convertDateObjectToDateString(startStr);
  }

  var endDateString = document.getElementById("EDate").value;
  if (endDateString == "") {
    var endStr = new Date();
    endDateString = convertDateObjectToDateString(endStr);
  }

  // From the drop down listbox, get the option they selected and act on it

  var x=document.getElementById("DropDownMenu_DataOption").selectedIndex;
  var y=document.getElementById("DropDownMenu_DataOption").options;
  var category = y[x].text;

  switch (category) {
    case "Roles":
      calculateRoles(person, startDateString, endDateString);
      break;
    case "Exobits":
      calculateExobits(person, startDateString, endDateString);
      break;
    case "Collections":
      calculateCollections(person, startDateString, endDateString);
      break;
    case "Collections Needed":
      calculateCollectionsNeeded(person, startDateString, endDateString);
      break;
    case "Lockboxes":
      calculateLockboxes(person, startDateString, endDateString);
      break;
    case "Marks":
      calculateMarks(person, startDateString, endDateString);
      break;
    case "Cash":
      calculateCash(person, startDateString, endDateString);
      break;
    case "Knockouts":
      calculateKnockouts(person, startDateString, endDateString);
      break;
    case "Plans":
      calculatePlans(person, startDateString, endDateString);
      break;
    case "Time":
      calculateTime(person, startDateString, endDateString);
      break;
    case "Feats":
      calculateFeats(person, startDateString, endDateString);
      break;
    case "Feats Needed":
      calculateFeatsNeeded(person, startDateString, endDateString);
      break;
    case "Damage Daily":
      calculateDamage(person, startDateString, endDateString);
      break;
    case "Damage Powers":
      calculateDamagePowers(person, startDateString, endDateString);
      break;
    case "Weapon Drops":
      calculateWeapons(person, startDateString, endDateString);
      break;
    case "Armor Drops":
      calculateArmor(person, startDateString, endDateString);
      break;
    case "Armor Needed":
      calculateArmorNeeded(person, startDateString, endDateString);
      break;
    case "Split Personality":
      calculateArmorTiming(person, startDateString, endDateString);
      break;
    case "Vault Trips":
      calculateVault(person, startDateString, endDateString);
      break;
    default:
      alert("Undefined selection type: " + y[x].text);
  }
}


// ********************************************************************
// *	convertDateStringToTimestamp
// *	Function that takes in a Date string and returns the unix timestamp
// ********************************************************************

function convertDateStringToTimestamp(dateStr)
{
  // If the date string does not contain a slash "/:, then assume it is
  //   already a timestamp

  if (dateStr.indexOf("/") < 0) {
    timestamp = parseFloat(dateStr);
    return timestamp;
  }
  // Have to include the radix of 10 as second param to parseint for leading 0 numbers like "01"
  var month = parseInt(dateStr.substring(0, 2), 10) - 1;
  var day   = parseInt(dateStr.substring(3, 5), 10);
  var year  = parseInt(dateStr.substring(6, 10));
  var myDate = new Date();
  var timestamp = Math.round(myDate.setFullYear(year,month,day) / 1000);

  return timestamp;
};

function convertTimestampToDateString(ts)
{
  var myDate = new Date();
  myDate.setTime(ts * 1000);
  return convertDateObjectToDateString(myDate);
};

function convertTimestampToDayOfWeek(ts)
{
  var weekday=new Array(7);
  weekday[0]="Sunday";
  weekday[1]="Monday";
  weekday[2]="Tuesday";
  weekday[3]="Wednesday";
  weekday[4]="Thursday";
  weekday[5]="Friday";
  weekday[6]="Saturday";

  var myDate = new Date();
  myDate.setTime(ts * 1000);

  return weekday[myDate.getDay()];
};

function convertDateObjectToDateString(dateObj)
{
  var monthStr = "";
  var dayStr = "";
  var yearStr = "";
  var dateStr = "";

  var month = dateObj.getMonth() + 1;
  if (month < 10) { monthStr = "0" + month.toString(); }
  else { monthStr = month.toString(); }

  var day = dateObj.getDate();
  if (day < 10) { dayStr = "0" + day.toString(); }
  else { dayStr = day.toString(); }

  var yearStr = dateObj.getFullYear();

  dateStr = monthStr + "/" + dayStr + "/" + yearStr;
  return dateStr;
};

/**
This is a JavaScript library that will allow you to easily add some basic DHTML
drop-down datepicker functionality to your Notes forms. This script is not as
full-featured as others you may find on the Internet, but it's free, it's easy to
understand, and it's easy to change.

You'll also want to include a stylesheet that makes the datepicker elements
look nice. An example one can be found in the database that this script was
originally released with, at:

http://www.nsftools.com/tips/NotesTips.htm#datepicker

I've tested this lightly with Internet Explorer 6 and Mozilla Firefox. I have no idea
how compatible it is with other browsers.

version 1.5
December 4, 2005
Julian Robichaux -- http://www.nsftools.com

HISTORY
--  version 1.0 (Sept. 4, 2004):
Initial release.

--  version 1.1 (Sept. 5, 2004):
Added capability to define the date format to be used, either globally (using the
defaultDateSeparator and defaultDateFormat variables) or when the displayDatePicker
function is called.

--  version 1.2 (Sept. 7, 2004):
Fixed problem where datepicker x-y coordinates weren't right inside of a table.
Fixed problem where datepicker wouldn't display over selection lists on a page.
Added a call to the datePickerClosed function (if one exists) after the datepicker
is closed, to allow the developer to add their own custom validation after a date
has been chosen. For this to work, you must have a function called datePickerClosed
somewhere on the page, that accepts a field object as a parameter. See the
example in the comments of the updateDateField function for more details.

--  version 1.3 (Sept. 9, 2004)
Fixed problem where adding the <div> and <iFrame> used for displaying the datepicker
was causing problems on IE 6 with global variables that had handles to objects on
the page (I fixed the problem by adding the elements using document.createElement()
and document.body.appendChild() instead of document.body.innerHTML += ...).

--  version 1.4 (Dec. 20, 2004)
Added "targetDateField.focus();" to the updateDateField function (as suggested
by Alan Lepofsky) to avoid a situation where the cursor focus is at the top of the
form after a date has been picked. Added "padding: 0px;" to the dpButton CSS
style, to keep the table from being so wide when displayed in Firefox.

-- version 1.5 (Dec 4, 2005)
Added display=none when datepicker is hidden, to fix problem where cursor is
not visible on input fields that are beneath the date picker. Added additional null
date handling for date errors in Safari when the date is empty. Added additional
error handling for iFrame creation, to avoid reported errors in Opera. Added
onMouseOver event for day cells, to allow color changes when the mouse hovers
over a cell (to make it easier to determine what cell you're over). Added comments
in the style sheet, to make it more clear what the different style elements are for.
*/

var datePickerDivID = "datepicker";
var iFrameDivID = "datepickeriframe";

var dayArrayShort = new Array('Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa');
var dayArrayMed = new Array('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat');
var dayArrayLong = new Array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday');
var monthArrayShort = new Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
var monthArrayMed = new Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'June', 'July', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec');
var monthArrayLong = new Array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');

// these variables define the date formatting we're expecting and outputting.
// If you want to use a different format by default, change the defaultDateSeparator
// and defaultDateFormat variables either here or on your HTML page.
var defaultDateSeparator = "/";        // common values would be "/" or "."
var defaultDateFormat = "mdy"    // valid values are "mdy", "dmy", and "ymd"
var dateSeparator = defaultDateSeparator;
var dateFormat = defaultDateFormat;

/**
This is the main function you'll call from the onClick event of a button.
Normally, you'll have something like this on your HTML page:

Start Date: <input name="StartDate">
<input type=button value="select" onclick="displayDatePicker('StartDate');">

That will cause the datepicker to be displayed beneath the StartDate field and
any date that is chosen will update the value of that field. If you'd rather have the
datepicker display beneath the button that was clicked, you can code the button
like this:

<input type=button value="select" onclick="displayDatePicker('StartDate', this);">

So, pretty much, the first argument (dateFieldName) is a string representing the
name of the field that will be modified if the user picks a date, and the second
argument (displayBelowThisObject) is optional and represents an actual node
on the HTML document that the datepicker should be displayed below.

In version 1.1 of this code, the dtFormat and dtSep variables were added, allowing
you to use a specific date format or date separator for a given call to this function.
Normally, you'll just want to set these defaults globally with the defaultDateSeparator
and defaultDateFormat variables, but it doesn't hurt anything to add them as optional
parameters here. An example of use is:

<input type=button value="select" onclick="displayDatePicker('StartDate', false, 'dmy', '.');">

This would display the datepicker beneath the StartDate field (because the
displayBelowThisObject parameter was false), and update the StartDate field with
the chosen value of the datepicker using a date format of dd.mm.yyyy
*/

function displayDatePicker(dateFieldName, displayBelowThisObject, dtFormat, dtSep)
{
  var targetDateField = document.getElementsByName (dateFieldName).item(0);

  // if we weren't told what node to display the datepicker beneath, just display it
  // beneath the date field we're updating
  if (!displayBelowThisObject)
    displayBelowThisObject = targetDateField;

  // if a date separator character was given, update the dateSeparator variable
  if (dtSep)
    dateSeparator = dtSep;
  else
    dateSeparator = defaultDateSeparator;

  // if a date format was given, update the dateFormat variable
  if (dtFormat)
    dateFormat = dtFormat;
  else
    dateFormat = defaultDateFormat;

  var x = displayBelowThisObject.offsetLeft;
  var y = displayBelowThisObject.offsetTop + displayBelowThisObject.offsetHeight ;

  // deal with elements inside tables and such
  var parent = displayBelowThisObject;
  while (parent.offsetParent) {
    parent = parent.offsetParent;
    x += parent.offsetLeft;
    y += parent.offsetTop ;
  }

  drawDatePicker(targetDateField, x, y);
}


/**
Draw the datepicker object (which is just a table with calendar elements) at the
specified x and y coordinates, using the targetDateField object as the input tag
that will ultimately be populated with a date.

This function will normally be called by the displayDatePicker function.
*/
function drawDatePicker(targetDateField, x, y)
{
  var dt = getFieldDate(targetDateField.value );

  // the datepicker table will be drawn inside of a <div> with an ID defined by the
  // global datePickerDivID variable. If such a div doesn't yet exist on the HTML
  // document we're working with, add one.
  if (!document.getElementById(datePickerDivID)) {
    // don't use innerHTML to update the body, because it can cause global variables
    // that are currently pointing to objects on the page to have bad references
    //document.body.innerHTML += "<div id='" + datePickerDivID + "' class='dpDiv'></div>";
    var newNode = document.createElement("div");
    newNode.setAttribute("id", datePickerDivID);
    newNode.setAttribute("class", "dpDiv");
    newNode.setAttribute("style", "visibility: hidden;");
    document.body.appendChild(newNode);
  }

  // move the datepicker div to the proper x,y coordinate and toggle the visiblity
  var pickerDiv = document.getElementById(datePickerDivID);
  pickerDiv.style.position = "absolute";
  pickerDiv.style.left = x + "px";
  pickerDiv.style.top = y + "px";
  pickerDiv.style.visibility = (pickerDiv.style.visibility == "visible" ? "hidden" : "visible");
  pickerDiv.style.display = (pickerDiv.style.display == "block" ? "none" : "block");
  pickerDiv.style.zIndex = 10000;

  // draw the datepicker table
  refreshDatePicker(targetDateField.name, dt.getFullYear(), dt.getMonth(), dt.getDate());
}


/**
This is the function that actually draws the datepicker calendar.
*/
function refreshDatePicker(dateFieldName, year, month, day)
{
  // if no arguments are passed, use today's date; otherwise, month and year
  // are required (if a day is passed, it will be highlighted later)
  var thisDay = new Date();

  if ((month >= 0) && (year > 0)) {
    thisDay = new Date(year, month, 1);
  } else {
    day = thisDay.getDate();
    thisDay.setDate(1);
  }

  // the calendar will be drawn as a table
  // you can customize the table elements with a global CSS style sheet,
  // or by hardcoding style and formatting elements below
  var crlf = "\r\n";
  var TABLE = "<table cols=7 class='dpTable'>" + crlf;
  var xTABLE = "</table>" + crlf;
  var TR = "<tr class='dpTR'>";
  var TR_title = "<tr class='dpTitleTR'>";
  var TR_days = "<tr class='dpDayTR'>";
  var TR_todaybutton = "<tr class='dpTodayButtonTR'>";
  var xTR = "</tr>" + crlf;
  var TD = "<td class='dpTD' onMouseOut='this.className=\"dpTD\";' onMouseOver=' this.className=\"dpTDHover\";' ";    // leave this tag open, because we'll be adding an onClick event
  var TD_title = "<td colspan=5 class='dpTitleTD'>";
  var TD_buttons = "<td class='dpButtonTD'>";
  var TD_todaybutton = "<td colspan=7 class='dpTodayButtonTD'>";
  var TD_days = "<td class='dpDayTD'>";
  var TD_selected = "<td class='dpDayHighlightTD' onMouseOut='this.className=\"dpDayHighlightTD\";' onMouseOver='this.className=\"dpTDHover\";' ";    // leave this tag open, because we'll be adding an onClick event
  var xTD = "</td>" + crlf;
  var DIV_title = "<div class='dpTitleText'>";
  var DIV_selected = "<div class='dpDayHighlight'>";
  var xDIV = "</div>";
  var i = 0;

  // start generating the code for the calendar table
  var html = TABLE;

  // this is the title bar, which displays the month and the buttons to
  // go back to a previous month or forward to the next month
  html += TR_title;
  html += TD_buttons + getButtonCode(dateFieldName, thisDay, -1, "&lt;") + xTD;
  html += TD_title + DIV_title + monthArrayLong[ thisDay.getMonth()] + " " + thisDay.getFullYear() + xDIV + xTD;
  html += TD_buttons + getButtonCode(dateFieldName, thisDay, 1, "&gt;") + xTD;
  html += xTR;

  // this is the row that indicates which day of the week we're on
  html += TR_days;
  for(i = 0; i < dayArrayShort.length; i++)
    html += TD_days + dayArrayShort[i] + xTD;
  html += xTR;

  // now we'll start populating the table with days of the month
  html += TR;

  // first, the leading blanks
  for (i = 0; i < thisDay.getDay(); i++)
    html += TD + "&nbsp;" + xTD;

  // now, the days of the month
  do {
    var dayNum = thisDay.getDate();
    var TD_onclick = " onclick=\"updateDateField('" + dateFieldName + "', '" + getDateString(thisDay) + "');\">";

    if (dayNum == day)
      html += TD_selected + TD_onclick + DIV_selected + dayNum + xDIV + xTD;
    else
      html += TD + TD_onclick + dayNum + xTD;

    // if this is a Saturday, start a new row
    if (thisDay.getDay() == 6)
      html += xTR + TR;

    // increment the day
    thisDay.setDate(thisDay.getDate() + 1);
  } while (thisDay.getDate() > 1)

  // fill in any trailing blanks
  if (thisDay.getDay() > 0) {
    for (i = 6; i > thisDay.getDay(); i--)
      html += TD + "&nbsp;" + xTD;
  }
  html += xTR;

  // add a button to allow the user to easily return to today, or close the calendar
  var today = new Date();
  var todayString = "Today is " + dayArrayMed[today.getDay()] + ", " + monthArrayMed[ today.getMonth()] + " " + today.getDate();
  html += TR_todaybutton + TD_todaybutton;
  html += "<button class='dpTodayButton' onClick='refreshDatePicker(\"" + dateFieldName + "\");'>this month</button> ";
  html += "<button class='dpTodayButton' onClick='updateDateField(\"" + dateFieldName + "\");'>close</button>";
  html += xTD + xTR;

  // and finally, close the table
  html += xTABLE;

  document.getElementById(datePickerDivID).innerHTML = html;
  // add an "iFrame shim" to allow the datepicker to display above selection lists
  adjustiFrame();
}


/**
Convenience function for writing the code for the buttons that bring us back or forward
a month.
*/
function getButtonCode(dateFieldName, dateVal, adjust, label)
{
  var newMonth = (dateVal.getMonth () + adjust) % 12;
  var newYear = dateVal.getFullYear() + parseInt((dateVal.getMonth() + adjust) / 12);
  if (newMonth < 0) {
    newMonth += 12;
    newYear += -1;
  }

  return "<button class='dpButton' onClick='refreshDatePicker(\"" + dateFieldName + "\", " + newYear + ", " + newMonth + ");'>" + label + "</button>";
}


/**
Convert a JavaScript Date object to a string, based on the dateFormat and dateSeparator
variables at the beginning of this script library.
*/
function getDateString(dateVal)
{
  var dayString = "00" + dateVal.getDate();
  var monthString = "00" + (dateVal.getMonth()+1);
  dayString = dayString.substring(dayString.length - 2);
  monthString = monthString.substring(monthString.length - 2);

  switch (dateFormat) {
    case "dmy" :
      return dayString + dateSeparator + monthString + dateSeparator + dateVal.getFullYear();
    case "ymd" :
      return dateVal.getFullYear() + dateSeparator + monthString + dateSeparator + dayString;
    case "mdy" :
    default :
      return monthString + dateSeparator + dayString + dateSeparator + dateVal.getFullYear();
  }
}


/**
Convert a string to a JavaScript Date object.
*/
function getFieldDate(dateString)
{
  var dateVal;
  var dArray;
  var d, m, y;

  try {
    dArray = splitDateString(dateString);
    if (dArray) {
      switch (dateFormat) {
        case "dmy" :
          d = parseInt(dArray[0], 10);
          m = parseInt(dArray[1], 10) - 1;
          y = parseInt(dArray[2], 10);
          break;
        case "ymd" :
          d = parseInt(dArray[2], 10);
          m = parseInt(dArray[1], 10) - 1;
          y = parseInt(dArray[0], 10);
          break;
        case "mdy" :
        default :
          d = parseInt(dArray[1], 10);
          m = parseInt(dArray[0], 10) - 1;
          y = parseInt(dArray[2], 10);
          break;
      }
      dateVal = new Date(y, m, d);
    } else if (dateString) {
      dateVal = new Date(dateString);
    } else {
      dateVal = new Date();
    }
  } catch(e) {
    dateVal = new Date();
  }

  return dateVal;
}


/**
Try to split a date string into an array of elements, using common date separators.
If the date is split, an array is returned; otherwise, we just return false.
*/
function splitDateString(dateString)
{
  var dArray;
  if (dateString.indexOf("/") >= 0)
    dArray = dateString.split("/");
  else if (dateString.indexOf(".") >= 0)
    dArray = dateString.split(".");
  else if (dateString.indexOf("-") >= 0)
    dArray = dateString.split("-");
  else if (dateString.indexOf("\\") >= 0)
    dArray = dateString.split("\\");
  else
    dArray = false;

  return dArray;
}

/**
Update the field with the given dateFieldName with the dateString that has been passed,
and hide the datepicker. If no dateString is passed, just close the datepicker without
changing the field value.

Also, if the page developer has defined a function called datePickerClosed anywhere on
the page or in an imported library, we will attempt to run that function with the updated
field as a parameter. This can be used for such things as date validation, setting default
values for related fields, etc. For example, you might have a function like this to validate
a start date field:

function datePickerClosed(dateField)
{
  var dateObj = getFieldDate(dateField.value);
  var today = new Date();
  today = new Date(today.getFullYear(), today.getMonth(), today.getDate());

  if (dateField.name == "StartDate") {
    if (dateObj < today) {
      // if the date is before today, alert the user and display the datepicker again
      alert("Please enter a date that is today or later");
      dateField.value = "";
      document.getElementById(datePickerDivID).style.visibility = "visible";
      adjustiFrame();
    } else {
      // if the date is okay, set the EndDate field to 7 days after the StartDate
      dateObj.setTime(dateObj.getTime() + (7 * 24 * 60 * 60 * 1000));
      var endDateField = document.getElementsByName ("EndDate").item(0);
      endDateField.value = getDateString(dateObj);
    }
  }
}

*/
function updateDateField(dateFieldName, dateString)
{
  var targetDateField = document.getElementsByName (dateFieldName).item(0);
  if (dateString)
    targetDateField.value = dateString;

  var pickerDiv = document.getElementById(datePickerDivID);
  pickerDiv.style.visibility = "hidden";
  pickerDiv.style.display = "none";

  adjustiFrame();
  targetDateField.focus();

  // after the datepicker has closed, optionally run a user-defined function called
  // datePickerClosed, passing the field that was just updated as a parameter
  // (note that this will only run if the user actually selected a date from the datepicker)
  if ((dateString) && (typeof(datePickerClosed) == "function"))
    datePickerClosed(targetDateField);
  dataOptionExecute();
}


/**
Use an "iFrame shim" to deal with problems where the datepicker shows up behind
selection list elements, if they're below the datepicker. The problem and solution are
described at:

http://dotnetjunkies.com/WebLog/jking/archive/2003/07/21/488.aspx
http://dotnetjunkies.com/WebLog/jking/archive/2003/10/30/2975.aspx
*/
function adjustiFrame(pickerDiv, iFrameDiv)
{
  // we know that Opera doesn't like something about this, so if we
  // think we're using Opera, don't even try
  var is_opera = (navigator.userAgent.toLowerCase().indexOf("opera") != -1);
  if (is_opera)
    return;

  // put a try/catch block around the whole thing, just in case
  try {
    if (!document.getElementById(iFrameDivID)) {
      // don't use innerHTML to update the body, because it can cause global variables
      // that are currently pointing to objects on the page to have bad references
      //document.body.innerHTML += "<iframe id='" + iFrameDivID + "' src='javascript:false;' scrolling='no' frameborder='0'>";
      var newNode = document.createElement("iFrame");
      newNode.setAttribute("id", iFrameDivID);
      newNode.setAttribute("src", "javascript:false;");
      newNode.setAttribute("scrolling", "no");
      newNode.setAttribute ("frameborder", "0");
      document.body.appendChild(newNode);
    }

    if (!pickerDiv)
      pickerDiv = document.getElementById(datePickerDivID);
    if (!iFrameDiv)
      iFrameDiv = document.getElementById(iFrameDivID);

    try {
      iFrameDiv.style.position = "absolute";
      iFrameDiv.style.width = pickerDiv.offsetWidth;
      iFrameDiv.style.height = pickerDiv.offsetHeight ;
      iFrameDiv.style.top = pickerDiv.style.top;
      iFrameDiv.style.left = pickerDiv.style.left;
      iFrameDiv.style.zIndex = pickerDiv.style.zIndex - 1;
      iFrameDiv.style.visibility = pickerDiv.style.visibility ;
      iFrameDiv.style.display = pickerDiv.style.display;
    } catch(e) {
    }

  } catch (ee) {
  }
}

/**
 * Copyright (c)2005-2009 Matt Kruse (javascripttoolbox.com)
 *
 * Dual licensed under the MIT and GPL licenses.
 * This basically means you can use this code however you want for
 * free, but don't claim to have written it yourself!
 * Donations always accepted: http://www.JavascriptToolbox.com/donate/
 *
 * Please do not link to the .js files on javascripttoolbox.com from
 * your site. Copy the files locally to your server instead.
 *
 */
/*
This code is inspired by and extended from Stuart Langridge's aqlist code:
    http://www.kryogenix.org/code/browser/aqlists/
    Stuart Langridge, November 2002
    sil@kryogenix.org
    Inspired by Aaron's labels.js (http://youngpup.net/demos/labels/)
    and Dave Lindquist's menuDropDown.js (http://www.gazingus.org/dhtml/?id=109)
*/

// Automatically attach a listener to the window onload, to convert the trees
addEvent(window,"load",convertTrees);

// Utility function to add an event listener
function addEvent(o,e,f){
  if (o.addEventListener){ o.addEventListener(e,f,false); return true; }
  else if (o.attachEvent){ return o.attachEvent("on"+e,f); }
  else { return false; }
}

// utility function to set a global variable if it is not already set
function setDefault(name,val) {
  if (typeof(window[name])=="undefined" || window[name]==null) {
    window[name]=val;
  }
}

// Full expands a tree with a given ID
function expandTree(treeId) {
  var ul = document.getElementById(treeId);
  if (ul == null) { return false; }
  expandCollapseList(ul,nodeOpenClass);
}

// Fully collapses a tree with a given ID
function collapseTree(treeId) {
  var ul = document.getElementById(treeId);
  if (ul == null) { return false; }
  expandCollapseList(ul,nodeClosedClass);
}

// Expands enough nodes to expose an LI with a given ID
function expandToItem(treeId,itemId) {
  var ul = document.getElementById(treeId);
  if (ul == null) { return false; }
  var ret = expandCollapseList(ul,nodeOpenClass,itemId);
  if (ret) {
    var o = document.getElementById(itemId);
    if (o.scrollIntoView) {
      o.scrollIntoView(false);
    }
  }
}

// Performs 3 functions:
// a) Expand all nodes
// b) Collapse all nodes
// c) Expand all nodes to reach a certain ID
function expandCollapseList(ul,cName,itemId) {
  if (!ul.childNodes || ul.childNodes.length==0) { return false; }
  // Iterate LIs
  for (var itemi=0;itemi<ul.childNodes.length;itemi++) {
    var item = ul.childNodes[itemi];
    if (itemId!=null && item.id==itemId) { return true; }
    if (item.nodeName == "LI") {
      // Iterate things in this LI
      var subLists = false;
      for (var sitemi=0;sitemi<item.childNodes.length;sitemi++) {
        var sitem = item.childNodes[sitemi];
        if (sitem.nodeName=="UL") {
          subLists = true;
          var ret = expandCollapseList(sitem,cName,itemId);
          if (itemId!=null && ret) {
            item.className=cName;
            return true;
          }
        }
      }
      if (subLists && itemId==null) {
        item.className = cName;
      }
    }
  }
}

// Search the document for UL elements with the correct CLASS name, then process them
function convertTrees() {
  setDefault("treeClass","mktree");
  setDefault("nodeClosedClass","liClosed");
  setDefault("nodeOpenClass","liOpen");
  setDefault("nodeBulletClass","liBullet");
  setDefault("nodeLinkClass","bullet");
  setDefault("preProcessTrees",true);
  if (preProcessTrees) {
    if (!document.createElement) { return; } // Without createElement, we can't do anything
    var uls = document.getElementsByTagName("ul");
    if (uls==null) { return; }
    var uls_length = uls.length;
    for (var uli=0;uli<uls_length;uli++) {
      var ul=uls[uli];
      if (ul.nodeName=="UL" && ul.className==treeClass) {
        processList(ul);
      }
    }
  }
}

function treeNodeOnclick() {
  this.parentNode.className = (this.parentNode.className==nodeOpenClass) ? nodeClosedClass : nodeOpenClass;
  return false;
}
function retFalse() {
  return false;
}
// Process a UL tag and all its children, to convert to a tree
function processList(ul) {
  if (!ul.childNodes || ul.childNodes.length==0) { return; }
  // Iterate LIs
  var childNodesLength = ul.childNodes.length;
  for (var itemi=0;itemi<childNodesLength;itemi++) {
    var item = ul.childNodes[itemi];
    if (item.nodeName == "LI") {
      // Iterate things in this LI
      var subLists = false;
      var itemChildNodesLength = item.childNodes.length;
      for (var sitemi=0;sitemi<itemChildNodesLength;sitemi++) {
        var sitem = item.childNodes[sitemi];
        if (sitem.nodeName=="UL") {
          subLists = true;
          processList(sitem);
        }
      }
      var s= document.createElement("SPAN");
      var t= '\u00A0'; // &nbsp;
      s.className = nodeLinkClass;
      if (subLists) {
        // This LI has UL's in it, so it's a +/- node
        if (item.className==null || item.className=="") {
          item.className = nodeClosedClass;
        }
        // If it's just text, make the text work as the link also
        if (item.firstChild.nodeName=="#text") {
          t = t+item.firstChild.nodeValue;
          item.removeChild(item.firstChild);
        }
        s.onclick = treeNodeOnclick;
      }
      else {
        // No sublists, so it's just a bullet node
        item.className = nodeBulletClass;
        s.onclick = retFalse;
      }
      s.appendChild(document.createTextNode(t));
      item.insertBefore(s,item.firstChild);
    }
  }
}

</script>
</body>
</html>
